Skip to content

Meeting.book

Book the call a buyer picked, at a time both calendars hold free.

Action class
None
Approval
Runs on its own
Emits
Meeting.booked
Sites
Google Calendar, Outlook
Price
Free
POST https://api.sb/{your-domain}/meetings/book

Books a time both calendars show free and sends the invite from your domain. The hub’s definition of Meeting.book.

Inputs

NameTypeDefaultMeaning
contactContactRequiredWho to meet.
atdatetimeRequiredWhen.

Outputs

FieldTypeWhat null means
meetingMeetingNever null.
meeting.atdatetimeNever null: the start sent, in UTC.
meeting.agendatextNull when the reply that asked for the call named no topic.

Effects

Action class

None: no approval rule names it, so it runs within its seat’s Permissions and Limits

Modes
  • try: Checks both calendars at at and returns the Meeting as it would be booked; no invite goes out.
  • send: Books it at once and sends the invite.
  • do: Books it at once and sends the invite.
Idempotency

Only with a key: the same Idempotency-Key and input return the first Action, and the same key with other input returns 409. A second booking with the same Contact at the same at returns the first Meeting.

Saved or shared

The Meeting is saved on the Contact and moves its open deal forward. A move in either calendar moves the Meeting.

Emits

Meeting.booked with { meeting, contact, at }

Performed by

Sales Engineer

Price

Free on your own account: the platform charges nothing for the call.

On each Venue

SiteFieldsFormats
Google Calendarat, contact, agenda, linkNone.
Outlookat, contact, agendaNone.

Google Calendar

Through Google Calendar.

Our fieldGoogle Calendar’s field
Meeting.atevent.start.dateTime and event.end.dateTime (Each with its timeZone)
Meeting.contactevent.attendees[].email
Meeting.agendaevent.description
Meeting.linkevent.conferenceData.createRequest (Adds a video link to the invite)
  • Free and busy times. Read live before every offer and never stored, so an offer is never stale by more than the minutes it takes to reply.
  • Bookable hours. Only inside the hours you set and never over a busy block on any calendar you connected.
  • One invite. Each Meeting sends one invite from your calendar; a move updates it, so the buyer never holds two.

Outlook

Through Outlook.

Our fieldOutlook’s field
Meeting.atevent.start and event.end (Each with its timeZone)
Meeting.contactevent.attendees[].emailAddress
Meeting.agendaevent.body
  • Bookings. Only inside your bookable hours and never over a busy block on any connected calendar.

What try does

AccountWhat try does
Google CalendarReads your free and busy times for real, picks the slot, and returns the invite it would send; nothing is written to your calendar.
OutlookRenders the exact email or invite and returns it with the time it would go; nothing reaches Outlook and no draft or event is saved.

Refuses when

CheckErrorFixThen call
A slot the calendar does not show free, or a line that presents the Product as availableavailabilityOffer only free calendar slots, and fix any line that says it ships; it pauses until fixed.Meeting.book

Every call through an account can also meet the shared account refusals: grant-missing, needs-reauth, account-not-connected, over-mandate, quota-reached, venue-rejected.

The availability payload
JSON
{
  "type": "https://startupbuilder.dev/errors/availability",
  "title": "Says it is available",
  "status": 422,
  "detail": "A slot the calendar does not show free, or a line that presents the Product as available.",
  "fix": "Offer only free calendar slots, and fix any line that says it ships; it pauses until fixed.",
  "next": {
    "verb": "Meeting.book",
    "input": {}
  },
  "instance": "https://api.sb/leaseline.app/actions/action_1"
}

When it waits

Returns in one response; nothing waits.

Example

Text
Book Rosa Alvarez for Tuesday at 2 p.m. Central, 30 minutes, on how
Northgate tracks renewals today.

To retry, send the same Idempotency-Key: the retry returns the first answer for $0. A new key reads again.

Test values

A sk_test_ key answers these the same way every time, at $0 (every test value).

Test valueAlways returnsWhat it is for
contact_test_busyRefuses with availabilityIts test calendar is busy every weekday from 2:00 to 3:00 p.m. Central, so a booking then refuses and names the next free slot.
maxCost: 0.0001Refuses with max-costAny priced call with a maxCost of 0.0001 is refused before it spends: the price is above the cap.
rate-limited.testRefuses with rate-limitedAny call naming this hostname answers 429 with Retry-After, so your retry logic runs.
sources-busy.testRefuses with sources-busyAny call naming this hostname answers 503 as if every route were busy, and nothing is spent.

Used by

None.