# `/v1/event-types`

Read access to the account's event types. There are no public write endpoints
yet — create, update, and delete are scoped (`event_types:create`,
`event_types:update`, `event_types:delete`) but not yet implemented; manage
event types from the [Event Types](/360/events) page in the meantime.

Even though there's no write API, you can still **track changes in real
time**: editing, toggling on/off, or deleting an event type in the dashboard
emits the [`event_type.updated` / `event_type.deleted`
webhooks](/help/api/webhooks#event-names). The `event_type.updated` payload is
byte-identical to [`GET /v1/event-types/:idOrSlug`](#get-v1event-typesidorslug)
below (locations, `questions[]`, limits and all), so an integration can keep
its own mirror of your catalog in sync without polling.

---

## GET `/v1/event-types`

List event types in the authenticated account.

| | |
|---|---|
| **Method** | `GET` |
| **URL** | `https://api.42min.us/v1/event-types` |
| **Scope** | `event_types:read` |
| **Auth** | Required |

### Query parameters

| Param | Type | Notes |
|---|---|---|
| `limit` | integer | Page size. Default `20`, max `100`. |
| `cursor` | string | Opaque cursor from a prior response's `meta.next_cursor`. |
| `sort` | string | `created_at_desc` (default), `created_at_asc`, or `title_asc`. |
| `user_id` | UUID | Filter to event types owned by one user. |
| `slug` | string | Filter by exact slug. |
| `active` | boolean | `true` → status=on; `false` → status=off. Omit to include both. |

### Response

```json
{
  "data": [
    {
      "id": "01HXXX…",
      "slug": "intro-call",
      "title": "Intro call",
      "description": "30-minute introduction.",
      "duration_minutes": 30,
      "active": true,
      "scheduling_type": "individual",
      "hosts": [
        { "user_id": "01H…", "username": "ada", "name": "Ada Lovelace" }
      ],
      "url": "https://42min.us/ada/intro-call",
      "color": "#7c3aed",
      "buffer_before_minutes": 0,
      "buffer_after_minutes": 0,
      "minimum_notice_hours": 4,
      "future_limit_days": 60,
      "timezone": "Europe/London",
      "created_at": "2026-04-01T10:12:34.000Z",
      "updated_at": "2026-05-02T08:00:00.000Z"
    }
  ],
  "meta": {
    "request_id": "req_…",
    "next_cursor": "eyJpZCI6Ii4uLiJ9",
    "has_more": true
  }
}
```

Field notes:

- `scheduling_type` — `individual` (1:1), `group` (one host, many invitees),
  or `collective` (round-robin distribution among a team).
- `hosts` — one entry for a 1:1 type; for round-robin types, the team members
  that can be assigned.
- `url` — the live booking page on the marketing host. `null` if no host
  username is set.
- `minimum_notice_hours` is rounded from minutes; the underlying field is
  per-minute.

### curl

```bash
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.42min.us/v1/event-types?active=true&limit=50"
```

---

## GET `/v1/event-types/:idOrSlug`

Return one event type with the full detail shape — locations, questions, and
limits.

| | |
|---|---|
| **Method** | `GET` |
| **URL** | `https://api.42min.us/v1/event-types/{id-or-slug}` |
| **Scope** | `event_types:read` |
| **Auth** | Required |

### Path parameter

- `{id-or-slug}` — either a UUID, or `username/event-slug` (URL-decoded by
  the router; pass `username%2Fevent-slug` in URLs).

### Response

```json
{
  "data": {
    "id": "01HXXX…",
    "slug": "intro-call",
    "title": "Intro call",
    "description": "30-minute introduction.",
    "duration_minutes": 30,
    "active": true,
    "scheduling_type": "individual",
    "hosts": [{ "user_id": "01H…", "username": "ada", "name": "Ada Lovelace" }],
    "url": "https://42min.us/ada/intro-call",
    "color": "#7c3aed",
    "buffer_before_minutes": 5,
    "buffer_after_minutes": 5,
    "minimum_notice_hours": 4,
    "future_limit_days": 60,
    "timezone": "Europe/London",
    "locations": [
      { "type": "google_meet", "label": "Google Meet", "value": null }
    ],
    "questions": [
      { "id": "01Q…", "key": "01Q…", "label": "Phone number", "type": "short_text", "required": false }
    ],
    "max_bookings_per_day": 8,
    "max_bookings_per_week": null,
    "max_bookings_per_month": null,
    "requires_confirmation": false,
    "allow_reschedule": true,
    "allow_cancel": true,
    "created_at": "2026-04-01T10:12:34.000Z",
    "updated_at": "2026-05-02T08:00:00.000Z"
  },
  "meta": { "request_id": "req_…" }
}
```

Field notes:

- `locations[].type` is one of `google_meet`, `microsoft_teams`, `custom_url`,
  `phone`, `physical`, `ask_invitee`.
- `questions[].key` and `id` are the same value today — `id` is reused as the
  stable key for booking-form responses.
- `requires_confirmation` is always `false` — the feature isn't modelled yet.

### curl

```bash
# By UUID
curl -H "Authorization: Bearer $TOKEN" \
  https://api.42min.us/v1/event-types/01HXXX…

# By username/slug
curl -H "Authorization: Bearer $TOKEN" \
  https://api.42min.us/v1/event-types/ada%2Fintro-call
```

### Common errors

- `400 invalid_query_param` — path segment is neither a UUID nor
  `username/event-slug`.
- `404 event_type_not_found` — no such event type in this account.
