Book a meeting (book_meeting's backing operation)
POST
/v1/calendar/events
const url = 'https://api.vocapable.com/v1/calendar/events';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"call_id":"example","contact_id":"example","start_time":"example","duration_minutes":1,"attendee_email":"example","attendee_name":"example","notes":"example","contact_timezone":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.vocapable.com/v1/calendar/events \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "call_id": "example", "contact_id": "example", "start_time": "example", "duration_minutes": 1, "attendee_email": "example", "attendee_name": "example", "notes": "example", "contact_timezone": "example" }'Replay-safe without idempotency middleware.
The runtime derives its tool idempotency key from the same arguments, so a replayed
book_meeting turn re-presents the same (call_id, start_time) pair:
find_for_call returns the existing appointment before any provider call, and
uq_appointments_integration_connection_id_external_event_id closes the race two
concurrent replays could still slip through.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Media typeapplication/json
CalendarEventCreateRequest
book_meeting’s backing request: the tool arguments plus their call context.
call_id and contact_id are supplied by the control-plane tool-execution path, never
by the model; the remaining fields carry exactly the frozen tool schema’s constraints.
object
call_id
required
Call Id
string
contact_id
required
Contact Id
string
start_time
required
Start Time
string
duration_minutes
required
Duration Minutes
integer
attendee_email
required
Attendee Email
string
Examplegenerated
{ "call_id": "example", "contact_id": "example", "start_time": "example", "duration_minutes": 1, "attendee_email": "example", "attendee_name": "example", "notes": "example", "contact_timezone": "example"}Responses
Section titled “Responses”Successful Response
Media typeapplication/json
Appointment
object
id
required
Id
string
call_id
required
Call Id
string
contact_id
required
Contact Id
string
starts_at
required
Starts At
string format: date-time
ends_at
required
Ends At
string format: date-time
attendees
Attendees
Array
status
required
Status
string
created_at
required
Created At
string format: date-time
updated_at
required
Updated At
string format: date-time
Example
{ "status": "booked"}Validation Error
Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationErrorobject
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example", "input": "example", "ctx": {} } ]}