# SavvyCal

> Work with your SavvyCal scheduling: find open slots and book, list and cancel events, create, copy, update and switch scheduling links on or off, read workflows, and manage webhooks.

App · 20 actions. Web page: https://docs.lodol.com/docs/integrations/savvycal

## Actions

### Book event

Book an event on a scheduling link for someone, at one of the link's open slots (use 'Get available slots' to find one). The link must be turned on.

**Inputs**

- Scheduling link (`link_id`, text, required): The scheduling link. Pick one, or give its id from an earlier step.
- Start (`start_at`, date and time, required): When the event starts. It must be the start of one of the link's open slots (see 'Get available slots').
- End (`end_at`, date and time, required): When the event ends, the end of the same open slot.
- Attendee name (`display_name`, text, required): The full name of the person booking.
- Attendee email (`email`, text, required): The email address of the person booking.
- Attendee time zone (`time_zone`, text, required): The time zone of the person booking, such as America/New_York.
- Attendee phone (`phone_number`, text): Their phone number with the country code, like +15555555555. Required only if the link always asks for one.
- Answers to the link's questions (`field_answers`, object): Each question's label (or id) with the answer, for example {"Company": "Acme"}. The question ids and types are looked up for you.
- Metadata (`metadata`, object): Your own keys and values to keep on the event.

**Outputs**

- `event` (object): The event

**Example output**

```json
{
  "event": {
    "attendees": [
      {
        "display_name": "Jo Bloggs",
        "email": "jo@example.com",
        "fields": [],
        "first_name": "Jo",
        "id": "attendee_01HX",
        "is_organizer": false,
        "last_name": "Bloggs",
        "marketing_opt_in": false,
        "phone_number": null,
        "response_status": "accepted",
        "time_zone": "America/New_York"
      }
    ],
    "buffer_after": 0,
    "buffer_before": 0,
    "conferencing": {
      "join_url": null,
      "type": "google_meet"
    },
    "created_at": "2026-10-15T09:00:00Z",
    "duration": 30,
    "end_at": "2026-10-20T14:30:00Z",
    "id": "event_01HXAMPLE",
    "is_group_session": false,
    "link": {
      "id": "link_01HXAMPLE",
      "name": "30-minute intro call",
      "slug": "intro"
    },
    "maximum_group_size": 1,
    "metadata": {},
    "organizer": {
      "display_name": "Jo Bloggs",
      "email": "jo@example.com",
      "fields": [],
      "first_name": "Jo",
      "id": "attendee_01HY",
      "is_organizer": true,
      "last_name": "Bloggs",
      "marketing_opt_in": false,
      "phone_number": null,
      "response_status": "accepted",
      "time_zone": "America/New_York"
    },
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "start_at": "2026-10-20T14:00:00Z",
    "state": "confirmed",
    "summary": "30-minute intro call",
    "url": "https://savvycal.com/events/2f3c3b1e",
    "uuid": "2f3c3b1e-6f1c-4c6a-9d1e-0b5b6f4e2a11"
  }
}
```

### Cancel event

Cancel an event, optionally giving a reason.

**Inputs**

- Event ID (`event_id`, text, required): The event's id or UUID, from 'List events' or an earlier step.
- Reason (`cancel_reason`, text): Why the event is canceled.

**Outputs**

- `event` (object): The event

**Example output**

```json
{
  "event": {
    "attendees": [
      {
        "display_name": "Jo Bloggs",
        "email": "jo@example.com",
        "fields": [],
        "first_name": "Jo",
        "id": "attendee_01HX",
        "is_organizer": false,
        "last_name": "Bloggs",
        "marketing_opt_in": false,
        "phone_number": null,
        "response_status": "accepted",
        "time_zone": "America/New_York"
      }
    ],
    "buffer_after": 0,
    "buffer_before": 0,
    "canceled_at": "2026-10-16T09:00:00Z",
    "conferencing": {
      "join_url": null,
      "type": "google_meet"
    },
    "created_at": "2026-10-15T09:00:00Z",
    "duration": 30,
    "end_at": "2026-10-20T14:30:00Z",
    "id": "event_01HXAMPLE",
    "is_group_session": false,
    "link": {
      "id": "link_01HXAMPLE",
      "name": "30-minute intro call",
      "slug": "intro"
    },
    "maximum_group_size": 1,
    "metadata": {},
    "organizer": {
      "display_name": "Jo Bloggs",
      "email": "jo@example.com",
      "fields": [],
      "first_name": "Jo",
      "id": "attendee_01HY",
      "is_organizer": true,
      "last_name": "Bloggs",
      "marketing_opt_in": false,
      "phone_number": null,
      "response_status": "accepted",
      "time_zone": "America/New_York"
    },
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "start_at": "2026-10-20T14:00:00Z",
    "state": "canceled",
    "summary": "30-minute intro call",
    "url": "https://savvycal.com/events/2f3c3b1e",
    "uuid": "2f3c3b1e-6f1c-4c6a-9d1e-0b5b6f4e2a11"
  }
}
```

### Create scheduling link

Create a scheduling link in your personal scope. Durations and availability use SavvyCal's defaults; to start from a link that has them set up, use 'Duplicate scheduling link' instead.

**Inputs**

- Name (`name`, text, required): The link's name, shown to people booking.
- Description (`description`, text): The short description shown on the booking page.
- Private name (`private_name`, text): A name only you see in SavvyCal, not people booking.
- Use (`link_type`, text): Multi-use links can be booked again and again; single-use links only once. One of: `recurring` (Multi-use), `single` (Single-use).

**Outputs**

- `link` (object): The scheduling link
- `scope_slug` (text): The slug of the scope the link is in, empty if none

**Example output**

```json
{
  "link": {
    "default_duration": 30,
    "description": "A quick hello.",
    "durations": [
      30
    ],
    "fields": [
      {
        "id": "field_01HX",
        "is_required": false,
        "label": "Company",
        "type": "short_text"
      }
    ],
    "id": "link_01HXAMPLE",
    "increment": 15,
    "name": "30-minute intro call",
    "private_name": null,
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "slug": "intro",
    "state": "active"
  },
  "scope_slug": "jo"
}
```

### Create scheduling link in a scope

Create a scheduling link in a team (or personal) scope, chosen by the scope's slug. You must be able to manage that scope.

**Inputs**

- Scope (`scope_slug`, text, required): The scope's slug, the part after savvycal.com/ in its booking links (for example acme-inc).
- Name (`name`, text, required): The link's name, shown to people booking.
- Description (`description`, text): The short description shown on the booking page.
- Private name (`private_name`, text): A name only you see in SavvyCal, not people booking.
- Use (`link_type`, text): Multi-use links can be booked again and again; single-use links only once. One of: `recurring` (Multi-use), `single` (Single-use).

**Outputs**

- `link` (object): The scheduling link
- `scope_slug` (text): The slug of the scope the link is in, empty if none

**Example output**

```json
{
  "link": {
    "default_duration": 30,
    "description": "A quick hello.",
    "durations": [
      30
    ],
    "fields": [
      {
        "id": "field_01HX",
        "is_required": false,
        "label": "Company",
        "type": "short_text"
      }
    ],
    "id": "link_01HXAMPLE",
    "increment": 15,
    "name": "30-minute intro call",
    "private_name": null,
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "slug": "intro",
    "state": "active"
  },
  "scope_slug": "jo"
}
```

### Create webhook

Have SavvyCal send every event notification (event created, canceled and so on) to an https address. The result includes the secret SavvyCal signs each delivery with.

**Inputs**

- Address (`url`, text, required): The https:// address to send notifications to.

**Outputs**

- `webhook` (object): The webhook

**Example output**

```json
{
  "webhook": {
    "created_at": "2026-10-15T09:00:00Z",
    "id": "wh_01HXAMPLE",
    "secret": "whsec_example",
    "state": "active",
    "url": "https://example.com/savvycal",
    "version": "1"
  }
}
```

### Delete scheduling link

Delete a scheduling link so it can no longer be booked.

**Inputs**

- Scheduling link (`link_id`, text, required): The scheduling link. Pick one, or give its id from an earlier step.

**Outputs**

- `deleted` (true/false): Always true once deleted
- `link` (object): The link, now deleted
- `link_id` (text): The link deleted
- `scope_slug` (text): The slug of the scope the link is in, empty if none

**Example output**

```json
{
  "deleted": true,
  "link": {
    "default_duration": 30,
    "description": "A quick hello.",
    "durations": [
      30
    ],
    "fields": [
      {
        "id": "field_01HX",
        "is_required": false,
        "label": "Company",
        "type": "short_text"
      }
    ],
    "id": "link_01HXAMPLE",
    "increment": 15,
    "name": "30-minute intro call",
    "private_name": null,
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "slug": "intro",
    "state": "deleted"
  },
  "link_id": "link_01HXAMPLE",
  "scope_slug": "jo"
}
```

### Delete webhook

Delete a webhook so SavvyCal stops sending to it.

**Inputs**

- Webhook ID (`webhook_id`, text, required): The webhook's id, from 'List webhooks' or 'Create webhook'.

**Outputs**

- `deleted` (true/false): Always true once deleted
- `webhook` (object): The webhook, now deleted
- `webhook_id` (text): The webhook deleted

**Example output**

```json
{
  "deleted": true,
  "webhook": {
    "created_at": "2026-10-15T09:00:00Z",
    "id": "wh_01HXAMPLE",
    "secret": "whsec_example",
    "state": "deleted",
    "url": "https://example.com/savvycal",
    "version": "1"
  },
  "webhook_id": "wh_01HXAMPLE"
}
```

### Duplicate scheduling link

Copy a scheduling link with its availability, durations and questions. Returns the new link.

**Inputs**

- Scheduling link (`link_id`, text, required): The scheduling link. Pick one, or give its id from an earlier step.

**Outputs**

- `link` (object): The scheduling link
- `scope_slug` (text): The slug of the scope the link is in, empty if none

**Example output**

```json
{
  "link": {
    "default_duration": 30,
    "description": "A quick hello.",
    "durations": [
      30
    ],
    "fields": [
      {
        "id": "field_01HX",
        "is_required": false,
        "label": "Company",
        "type": "short_text"
      }
    ],
    "id": "link_01HYCOPY",
    "increment": 15,
    "name": "30-minute intro call",
    "private_name": null,
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "slug": "intro-2",
    "state": "active"
  },
  "scope_slug": "jo"
}
```

### Get available slots

List the open times on a scheduling link, up to 31 days at a time (the next seven days unless a window is given). Use a slot's start and end to book with 'Book event'.

**Inputs**

- Scheduling link (`link_id`, text, required): The scheduling link. Pick one, or give its id from an earlier step.
- From (`from_time`, date and time): Start of the window to search. Defaults to now.
- Until (`until_time`, date and time): End of the window, at most 31 days after the start. Defaults to seven days after it.

**Outputs**

- `count` (number): How many
- `from` (text): Window start (UTC)
- `slots` (list): The open slots
- `until` (text): Window end (UTC)

**Example output**

```json
{
  "count": 1,
  "from": "2026-10-15T09:00:00Z",
  "slots": [
    {
      "duration": 30,
      "end_at": "2026-10-20T14:30:00Z",
      "rank": 1,
      "start_at": "2026-10-20T14:00:00Z"
    }
  ],
  "until": "2026-10-22T09:00:00Z"
}
```

### Get current user

Get the SavvyCal user the connection acts as: name, email, plan (free, basic or premium), time zone and time format.

**Inputs**: None.

**Outputs**

- `user` (object): The connected user

**Example output**

```json
{
  "user": {
    "avatar_url": null,
    "display_name": "Jo Bloggs",
    "email": "jo@example.com",
    "first_day_of_week": 1,
    "first_name": "Jo",
    "id": "user_01HX",
    "last_name": "Bloggs",
    "plan": "basic",
    "time_format": "12hr",
    "time_zone": "America/New_York"
  }
}
```

### Get event

Get one event with its time, attendees, answers, conferencing details and state.

**Inputs**

- Event ID (`event_id`, text, required): The event's id or UUID, from 'List events' or an earlier step.

**Outputs**

- `event` (object): The event

**Example output**

```json
{
  "event": {
    "attendees": [
      {
        "display_name": "Jo Bloggs",
        "email": "jo@example.com",
        "fields": [],
        "first_name": "Jo",
        "id": "attendee_01HX",
        "is_organizer": false,
        "last_name": "Bloggs",
        "marketing_opt_in": false,
        "phone_number": null,
        "response_status": "accepted",
        "time_zone": "America/New_York"
      }
    ],
    "buffer_after": 0,
    "buffer_before": 0,
    "conferencing": {
      "join_url": null,
      "type": "google_meet"
    },
    "created_at": "2026-10-15T09:00:00Z",
    "duration": 30,
    "end_at": "2026-10-20T14:30:00Z",
    "id": "event_01HXAMPLE",
    "is_group_session": false,
    "link": {
      "id": "link_01HXAMPLE",
      "name": "30-minute intro call",
      "slug": "intro"
    },
    "maximum_group_size": 1,
    "metadata": {},
    "organizer": {
      "display_name": "Jo Bloggs",
      "email": "jo@example.com",
      "fields": [],
      "first_name": "Jo",
      "id": "attendee_01HY",
      "is_organizer": true,
      "last_name": "Bloggs",
      "marketing_opt_in": false,
      "phone_number": null,
      "response_status": "accepted",
      "time_zone": "America/New_York"
    },
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "start_at": "2026-10-20T14:00:00Z",
    "state": "confirmed",
    "summary": "30-minute intro call",
    "url": "https://savvycal.com/events/2f3c3b1e",
    "uuid": "2f3c3b1e-6f1c-4c6a-9d1e-0b5b6f4e2a11"
  }
}
```

### Get scheduling link

Get one scheduling link with its state, durations and booking questions.

**Inputs**

- Scheduling link (`link_id`, text, required): The scheduling link. Pick one, or give its id from an earlier step.

**Outputs**

- `link` (object): The scheduling link
- `scope_slug` (text): The slug of the scope the link is in, empty if none

**Example output**

```json
{
  "link": {
    "default_duration": 30,
    "description": "A quick hello.",
    "durations": [
      30
    ],
    "fields": [
      {
        "id": "field_01HX",
        "is_required": false,
        "label": "Company",
        "type": "short_text"
      }
    ],
    "id": "link_01HXAMPLE",
    "increment": 15,
    "name": "30-minute intro call",
    "private_name": null,
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "slug": "intro",
    "state": "active"
  },
  "scope_slug": "jo"
}
```

### Get webhook

Get one webhook with its address, state and signing secret.

**Inputs**

- Webhook ID (`webhook_id`, text, required): The webhook's id, from 'List webhooks' or 'Create webhook'.

**Outputs**

- `webhook` (object): The webhook

**Example output**

```json
{
  "webhook": {
    "created_at": "2026-10-15T09:00:00Z",
    "id": "wh_01HXAMPLE",
    "secret": "whsec_example",
    "state": "active",
    "url": "https://example.com/savvycal",
    "version": "1"
  }
}
```

### List events

List events, filtered by state, time, date range or scheduling link. Returns one page; pass 'next_cursor' as 'after' for more.

**Inputs**

- State (`state`, text): Which events to include. Defaults to confirmed. One of: `confirmed` (Confirmed (default)), `all`, `canceled`, `tentative`, `awaiting_approval` (Awaiting approval), `declined`, `awaiting_reschedule` (Awaiting reschedule), `awaiting_checkout` (Awaiting checkout), `checkout_expired` (Checkout expired).
- When (`period`, text): Upcoming, past or all events. Ignored when a date range is given below. Defaults to upcoming. One of: `upcoming` (Upcoming (default)), `past`, `all`.
- Starting on or after (`from_date`, date): Only events that start on or after this date.
- Starting on or before (`until_date`, date): Only events that start on or before this date.
- Order (`direction`, text): Sort by start time. Defaults to oldest first. One of: `asc` (Oldest first (default)), `desc` (Newest first).
- Whose events (`attendance`, text): Only events you attend, or every event you can see (such as your team's). Defaults to events you attend. One of: `attending` (Events I attend (default)), `any` (Every event I can see).
- Scheduling link (`link_id`, text): Only events booked through this link.
- Page size (`limit`, number): How many to return, 1 to 100. SavvyCal's default is 20. From 1 to 100.
- Next page cursor (`after`, text): The 'next_cursor' from an earlier page, to get the page after it.
- Previous page cursor (`before`, text): The 'previous_cursor' from an earlier page, to get the page before it.

**Outputs**

- `count` (number): How many on this page
- `events` (list): The events
- `next_cursor` (text): Pass as 'after' for the next page; empty on the last one
- `previous_cursor` (text): Pass as 'before' for the previous page; empty on the first

**Example output**

```json
{
  "count": 1,
  "events": [
    {
      "attendees": [
        {
          "display_name": "Jo Bloggs",
          "email": "jo@example.com",
          "fields": [],
          "first_name": "Jo",
          "id": "attendee_01HX",
          "is_organizer": false,
          "last_name": "Bloggs",
          "marketing_opt_in": false,
          "phone_number": null,
          "response_status": "accepted",
          "time_zone": "America/New_York"
        }
      ],
      "buffer_after": 0,
      "buffer_before": 0,
      "conferencing": {
        "join_url": null,
        "type": "google_meet"
      },
      "created_at": "2026-10-15T09:00:00Z",
      "duration": 30,
      "end_at": "2026-10-20T14:30:00Z",
      "id": "event_01HXAMPLE",
      "is_group_session": false,
      "link": {
        "id": "link_01HXAMPLE",
        "name": "30-minute intro call",
        "slug": "intro"
      },
      "maximum_group_size": 1,
      "metadata": {},
      "organizer": {
        "display_name": "Jo Bloggs",
        "email": "jo@example.com",
        "fields": [],
        "first_name": "Jo",
        "id": "attendee_01HY",
        "is_organizer": true,
        "last_name": "Bloggs",
        "marketing_opt_in": false,
        "phone_number": null,
        "response_status": "accepted",
        "time_zone": "America/New_York"
      },
      "scope": {
        "id": "scope_01HX",
        "name": "Jo Bloggs",
        "slug": "jo"
      },
      "start_at": "2026-10-20T14:00:00Z",
      "state": "confirmed",
      "summary": "30-minute intro call",
      "url": "https://savvycal.com/events/2f3c3b1e",
      "uuid": "2f3c3b1e-6f1c-4c6a-9d1e-0b5b6f4e2a11"
    }
  ],
  "next_cursor": "",
  "previous_cursor": ""
}
```

### List scheduling links

List the scheduling links you can manage. Returns one page; pass 'next_cursor' as 'after' for more.

**Inputs**

- State (`state`, text): Only links that are on, or only those that are off. One of: `active`, `disabled`.
- Page size (`limit`, number): How many to return, 1 to 100. SavvyCal's default is 20. From 1 to 100.
- Next page cursor (`after`, text): The 'next_cursor' from an earlier page, to get the page after it.
- Previous page cursor (`before`, text): The 'previous_cursor' from an earlier page, to get the page before it.

**Outputs**

- `count` (number): How many on this page
- `links` (list): The scheduling links
- `next_cursor` (text): Pass as 'after' for the next page; empty on the last one
- `previous_cursor` (text): Pass as 'before' for the previous page; empty on the first

**Example output**

```json
{
  "count": 1,
  "links": [
    {
      "default_duration": 30,
      "description": "A quick hello.",
      "durations": [
        30
      ],
      "fields": [
        {
          "id": "field_01HX",
          "is_required": false,
          "label": "Company",
          "type": "short_text"
        }
      ],
      "id": "link_01HXAMPLE",
      "increment": 15,
      "name": "30-minute intro call",
      "private_name": null,
      "scope": {
        "id": "scope_01HX",
        "name": "Jo Bloggs",
        "slug": "jo"
      },
      "slug": "intro",
      "state": "active"
    }
  ],
  "next_cursor": "",
  "previous_cursor": ""
}
```

### List webhooks

List the account's webhooks with their addresses, states and signing secrets.

**Inputs**

- Page size (`limit`, number): How many to return, 1 to 100. SavvyCal's default is 20. From 1 to 100.
- Next page cursor (`after`, text): The 'next_cursor' from an earlier page, to get the page after it.
- Previous page cursor (`before`, text): The 'previous_cursor' from an earlier page, to get the page before it.

**Outputs**

- `count` (number): How many on this page
- `next_cursor` (text): Pass as 'after' for the next page; empty on the last one
- `previous_cursor` (text): Pass as 'before' for the previous page; empty on the first
- `webhooks` (list): The webhooks

**Example output**

```json
{
  "count": 1,
  "next_cursor": "",
  "previous_cursor": "",
  "webhooks": [
    {
      "created_at": "2026-10-15T09:00:00Z",
      "id": "wh_01HXAMPLE",
      "secret": "whsec_example",
      "state": "active",
      "url": "https://example.com/savvycal",
      "version": "1"
    }
  ]
}
```

### List workflow rules

List a workflow's rules: what triggers each one, how long before or after, and the actions it takes.

**Inputs**

- Workflow (`savvycal_workflow_id`, text, required): The SavvyCal workflow. Pick one, or give its id.

**Outputs**

- `count` (number): How many
- `rules` (list): The workflow's rules

**Example output**

```json
{
  "count": 1,
  "rules": [
    {
      "actions": [
        {
          "created_at": "2026-10-01T09:00:00Z",
          "id": "action_01HX",
          "properties": {},
          "type": "send_custom_email"
        }
      ],
      "created_at": "2026-10-01T09:00:00Z",
      "id": "rule_01HX",
      "trigger_offset_amount": 1,
      "trigger_offset_direction": "before",
      "trigger_offset_unit": "hours",
      "trigger_type": "event_started"
    }
  ]
}
```

### List workflows

List the workflows (reminders and follow-ups) in the scopes you manage.

**Inputs**

- Page size (`limit`, number): How many to return, 1 to 100. SavvyCal's default is 20. From 1 to 100.
- Next page cursor (`after`, text): The 'next_cursor' from an earlier page, to get the page after it.
- Previous page cursor (`before`, text): The 'previous_cursor' from an earlier page, to get the page before it.

**Outputs**

- `count` (number): How many on this page
- `next_cursor` (text): Pass as 'after' for the next page; empty on the last one
- `previous_cursor` (text): Pass as 'before' for the previous page; empty on the first
- `workflows` (list): The workflows

**Example output**

```json
{
  "count": 1,
  "next_cursor": "",
  "previous_cursor": "",
  "workflows": [
    {
      "created_at": "2026-10-01T09:00:00Z",
      "id": "wf_01HXAMPLE",
      "name": "Reminders",
      "state": "active"
    }
  ]
}
```

### Turn scheduling link on or off

Turn a scheduling link on (active) or off (disabled). Nothing changes if it is already that way. Turning a link on needs a paid SavvyCal plan or trial.

**Inputs**

- Scheduling link (`link_id`, text, required): The scheduling link. Pick one, or give its id from an earlier step.
- State (`state`, text, required): On lets people book through the link; off stops it. One of: `active` (On (active)), `disabled` (Off (disabled)).

**Outputs**

- `changed` (true/false): False if the link was already in that state
- `link` (object): The scheduling link
- `scope_slug` (text): The slug of the scope the link is in, empty if none

**Example output**

```json
{
  "changed": true,
  "link": {
    "default_duration": 30,
    "description": "A quick hello.",
    "durations": [
      30
    ],
    "fields": [
      {
        "id": "field_01HX",
        "is_required": false,
        "label": "Company",
        "type": "short_text"
      }
    ],
    "id": "link_01HXAMPLE",
    "increment": 15,
    "name": "30-minute intro call",
    "private_name": null,
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "slug": "intro",
    "state": "disabled"
  },
  "scope_slug": "jo"
}
```

### Update scheduling link

Change a scheduling link's name, description, private name or use. Only the fields given change.

**Inputs**

- Scheduling link (`link_id`, text, required): The scheduling link. Pick one, or give its id from an earlier step.
- Name (`name`, text): A new name for the link. Leave empty to keep it.
- Description (`description`, text): A new description. Leave empty to keep it.
- Private name (`private_name`, text): A new private name. Leave empty to keep it.
- Use (`link_type`, text): Change between multi-use and single-use. Leave empty to keep it. One of: `recurring` (Multi-use), `single` (Single-use).

**Outputs**

- `link` (object): The scheduling link
- `scope_slug` (text): The slug of the scope the link is in, empty if none

**Example output**

```json
{
  "link": {
    "default_duration": 30,
    "description": "A quick hello.",
    "durations": [
      30
    ],
    "fields": [
      {
        "id": "field_01HX",
        "is_required": false,
        "label": "Company",
        "type": "short_text"
      }
    ],
    "id": "link_01HXAMPLE",
    "increment": 15,
    "name": "45-minute intro call",
    "private_name": null,
    "scope": {
      "id": "scope_01HX",
      "name": "Jo Bloggs",
      "slug": "jo"
    },
    "slug": "intro",
    "state": "active"
  },
  "scope_slug": "jo"
}
```
