# Event types and slots

Bookable event types and their free slots.

Source: https://docs.leadarc.io/reference-event-types.html

- [GET /v1/workspaces/{ws}/event_types](#get-v1-workspaces-ws-event-types)
- [GET /v1/workspaces/{ws}/event_types/{id}](#get-v1-workspaces-ws-event-types-id)
- [GET /v1/workspaces/{ws}/event_types/{id}/slots](#get-v1-workspaces-ws-event-types-id-slots)

## GET /v1/workspaces/{ws}/event_types

`event_types:read` · read bucket · returns list of event_type

Bookable event types

```bash
curl -sS https://api.leadarc.io/v1/workspaces/airpay/event_types?limit=25 \
  -H "Authorization: Bearer $LEADARC_API_KEY"
```

**Query parameters.** Anything else is [`400 unsupported_filter`](errors.html#status-400).

`limit` `cursor` `order` `active` `public`

`starting_after` also works here, but prefer [`cursor`](pagination.html#cursors).

**Errors from this endpoint**, on top of the [common ones](errors.html): [`invalid_cursor`](errors.html#status-400), [`invalid_request`](errors.html#status-400), `unsupported_filter`.

```json
{
  "object": "list",
  "data": [{
    "object": "event_type",
    "id": "evt_Wu3ZomyygPicrgjIS8BCvQCFto8fHiIno2TeJH",
    "workspace": "airpay",
    "name": "Intro call",
    "slug": "airpay-intro",
    "description": "<p>30 minutes to see whether we fit.</p>",
    "event_name_template": "{workspace} <> {name}",
    "duration_minutes": 30,
    "buffer_before_minutes": 0,
    "buffer_after_minutes": 10,
    "scheduling_type": "round_robin",
    "public": true,
    "public_url": "https://inbox.outboundleads.io/book/airpay-intro",
    "public_booking_window_days": 45,
    "minimum_notice_minutes": 240,
    "business_emails_only": true,
    "redirect_url": null,
    "workspace_wide": true,
    "active": true,
    "requires_confirmation": false,
    "location": { "type": "google_meet", "phone": null, "description": null },
    "order_index": 0,
    "use_event_type_availability": false,
    "default_field_config": {
      "first_name": { "included": true, "required": true },
      "last_name":  { "included": true, "required": false },
      "company":    { "included": true, "required": true },
      "email":      { "included": true, "required": true },
      "phone":      { "included": true, "required": false }
    },
    "booking_provider": "native",
    "created_by_id": "usr_zaDRRpdu8EPZSU3i89lvZgKPkVQo4uBFA_KOhm",
    "created_at": "2026-07-01T09:00:00Z",
    "updated_at": "2026-07-24T11:05:00Z"
  }],
  "has_more": false,
  "next_cursor": null
}
```
`default_field_config` returns `{}` in the database when the built-in defaults apply. The API resolves it through `resolveDefaultFieldConfig` in the app and always returns the concrete map, so a caller never has to know the empty-object convention.

`external_id` and `exclude_from_insights` are withheld. `external_id` is a provider-side event-type id paired with the workspace's connector credential.

## GET /v1/workspaces/{ws}/event_types/{id}

`event_types:read` · read bucket · returns event_type

One event type with hosts and form fields

```bash
curl -sS https://api.leadarc.io/v1/workspaces/airpay/event_types/evt_Wu3ZomyygPicrgjIS8BCvQCFto8fHiIno2TeJH \
  -H "Authorization: Bearer $LEADARC_API_KEY"
```

**Errors from this endpoint**, on top of the [common ones](errors.html): `invalid_request`, [`not_found`](errors.html#status-404).

`event_type_email_settings` is **not** returned. Its subject and body templates are internal copy, and `host_notify_user_ids` is an internal routing list.

## GET /v1/workspaces/{ws}/event_types/{id}/slots

`event_types:read` · upstream bucket · returns availability

Free slots in a window

```bash
curl -sS https://api.leadarc.io/v1/workspaces/airpay/event_types/evt_Wu3ZomyygPicrgjIS8BCvQCFto8fHiIno2TeJH/slots?limit=25 \
  -H "Authorization: Bearer $LEADARC_API_KEY"
```

**Query parameters.** Anything else is `400 unsupported_filter`.

`from` `to` `timezone`

**Errors from this endpoint**, on top of the [common ones](errors.html): `invalid_request`, `not_found`, `unsupported_filter`, [`upstream_error`](errors.html#status-502).

```json
{
  "object": "availability",
  "event_type_id": "evt_Wu3ZomyygPicrgjIS8BCvQCFto8fHiIno2TeJH",
  "duration_minutes": 30,
  "timezone": "America/New_York",
  "window": { "from": "2026-07-28T00:00:00Z", "to": "2026-08-04T00:00:00Z" },
  "slots": [
    { "object": "slot", "start": "2026-07-30T14:00:00Z", "end": "2026-07-30T14:30:00Z" },
    { "object": "slot", "start": "2026-07-30T15:00:00Z", "end": "2026-07-30T15:30:00Z" }
  ],
  "reason": null
}
```
A [`slot`](objects.html#slot) carries a start and an end and **nothing else**. No host identity, deliberately, so a caller cannot enumerate who is free when. `reason` is a short string when the list is empty and there is a knowable cause (`"outside_booking_window"`, `"no_active_hosts"`, `"no_calendar_connected"`).

The window is clamped server-side against the event type's `public_booking_window_days` and `minimum_notice_minutes`, independently of anything the caller sends. That is the same pattern the app uses, and its comment says why: "the client clamps too, but never trust it."

---

---

Base URL `https://api.leadarc.io/v1`. Generated from the API source.
