# Give me a booking link

URL: /systems/sales/give-me-a-booking-link · Id: `guide:give-me-a-booking-link` · Status: `planned`

> Say "give me a booking link" and get a link at your domain that books calls into the hours you keep free, with reminders sent.

Send one link, and people book a call in the hours you keep free. Its status is `planned`: your agent tells you so and runs nothing yet.

Needs: [Startup](/business/nouns/startup)

**Before it runs**

- Who says yes: You. Your agent shows you the run and waits for your [Approval](/business/nouns/approval).
- You leave the chat: Never.
- What it costs: Nothing.
- To undo it: Delete the Meeting Type; it stays restorable, and Meetings already booked stay booked.

## What you get
- 1 booking link at your Domain (Meeting Type)
- 1 set of weekly hours, less what your calendar already holds (Availability)
- 1 Meeting per booking, with a join link and a reminder (Meeting)

## Your agent does
**For agents**

- Guide: `guide:give-me-a-booking-link`, status `planned`: say it is planned; do not run it. Page: [/systems/sales/give-me-a-booking-link.md](/systems/sales/give-me-a-booking-link.md).
- Approval: ask the founder first. Show the run, then wait for their Approval; a refusal ends it.
- Leaves the chat: never.
- Needs first: [Startup](/business/nouns/startup).
- Run: call the steps in order, each through the API, SDK, CLI or MCP tab below; a later step passes the `$id` an earlier one returns. Each value marked example is the sample business’s: pass the founder’s own.

| Step | Verb | Inputs (type, required, this guide’s value) | Returns |
| --- | --- | --- | --- |
| 1 | [`Availability.set`](/business/nouns/availability/set) (`verb:Availability.set`) | `worker` Worker (an id), required: the `$id` of the first Human `Human.list` returns; `hours` json, required: example `{"tue":["09:00-12:00"],"thu":["13:00-17:00"]}`; `timezone` string, required: example `"America/Chicago"` | `availability` Availability |
| 2 | [`MeetingType.create`](/business/nouns/meeting-type/create) (`verb:MeetingType.create`) | `name` string, required: example `"Intro call"`; `duration` integer, required: example `20`; `medium` string, required: example `"video"`; `availability` Availability (an id), required: the `$id` step 1 returns | `meetingType` MeetingType |
| 3 | [`MeetingType.publish`](/business/nouns/meeting-type/publish) (`verb:MeetingType.publish`) | `meetingType` MeetingType (an id), required: the `$id` step 2 returns | `meetingType` MeetingType |

Returns: the last call answers with `meetingType` and its `action`, whose `status` is `done`, `pending` (waiting on an Approval or a Worker), `failed`, `canceled` or `refused`:

```json
{
  "api": "https://api.sb/leaseline.app",
  "meetingType": {
    "$id": "https://api.sb/leaseline.app/meeting-types/mtgtype_qw2d5yGLVN",
    "$type": "MeetingType",
    "name": "Intro call",
    "duration": 20,
    "medium": "video",
    "availability": "availability_8Zj0a7vvRl"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/act_br07HsG8MG",
    "operation": "MeetingType.publish",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/act_br07HsG8MG"
  }
}
```

Next: offer “Make it 30 minutes”, or “Only offer Tuesday and Thursday mornings”.

Calls: `Availability.set` → `MeetingType.create` → `MeetingType.publish`

Ask:

```text
Give me a booking link.
Send them my booking link.
Let people book a call with me.
```

API:

```bash
# Look up the Human: Human.list
WORKER=$(curl "https://api.sb/leaseline.app/humans?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.humans[0]["$id"] | split("/") | last')

# 1. Availability.set
AVAILABILITY=$(curl -X POST https://api.sb/leaseline.app/availabilities/set \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"worker":"'"$WORKER"'","hours":{"tue":["09:00-12:00"],"thu":["13:00-17:00"]},"timezone":"America/Chicago"}' | jq -r '.availability["$id"] | split("/") | last')

# 2. MeetingType.create
MEETING_TYPE=$(curl -X POST https://api.sb/leaseline.app/meeting-types \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Intro call","duration":20,"medium":"video","availability":"'"$AVAILABILITY"'"}' | jq -r '.meetingType["$id"] | split("/") | last')

# 3. MeetingType.publish
curl -X POST https://api.sb/leaseline.app/meeting-types/$MEETING_TYPE/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

SDK:

```ts
import { $ } from 'startup-builder'

const [worker] = await $.Human.list({ limit: 1 })
const availability = await $.Availability.set({ worker: worker.$id, hours: { tue: ['09:00-12:00'], thu: ['13:00-17:00'] }, timezone: 'America/Chicago' })
const meetingType = await $.MeetingType.create({ name: 'Intro call', duration: 20, medium: 'video', availability: availability.$id })
await $.MeetingType.publish({ meetingType: meetingType.$id })
```

CLI:

```bash
WORKER=$(npx startup-builder do Human.list --json '{"limit":1}' | jq -r '.humans[0]["$id"] | split("/") | last')
AVAILABILITY=$(npx startup-builder do Availability.set --json '{"worker":"'"$WORKER"'","hours":{"tue":["09:00-12:00"],"thu":["13:00-17:00"]},"timezone":"America/Chicago"}' | jq -r '.availability["$id"] | split("/") | last')
MEETING_TYPE=$(npx startup-builder do MeetingType.create --json '{"name":"Intro call","duration":20,"medium":"video","availability":"'"$AVAILABILITY"'"}' | jq -r '.meetingType["$id"] | split("/") | last')
npx startup-builder do MeetingType.publish --json '{"meetingType":"'"$MEETING_TYPE"'"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "const [worker] = await $.Human.list({ limit: 1 })\nconst availability = await $.Availability.set({ worker: worker.$id, hours: { tue: ['09:00-12:00'], thu: ['13:00-17:00'] }, timezone: 'America/Chicago' })\nconst meetingType = await $.MeetingType.create({ name: 'Intro call', duration: 20, medium: 'video', availability: availability.$id })\nreturn await $.MeetingType.publish({ meetingType: meetingType.$id })"
  }
}
```

## Change it
- Make it 30 minutes.
- Only offer Tuesday and Thursday mornings.
- Ask what they want to talk about before they book.

## Under the hood
- Systems: [Scheduling](/systems/scheduling), [CRM](/systems/crm)
- Nouns: [Meeting Type](/business/nouns/meeting-type), [Availability](/business/nouns/availability), [Meeting](/business/nouns/meeting)
- Events: [`MeetingType.published`](/business/events/MeetingType.published), [`Meeting.booked`](/business/events/Meeting.booked)

Each booking calls [`Meeting.book`](/business/nouns/meeting/book) and raises `Meeting.booked`, which starts [Prepare and follow up a call](/workflows/processes/meeting-follow-up/prepare-and-follow-up). A [Meeting Type](/business/nouns/meeting-type) with an [Offer](/business/nouns/offer) takes payment before the time is held.