Skip to content

Scheduler

6 endpoints

Scheduler experiences and booking callbacks

GET /scheduler/experiences

List scheduler experiences

Return all scheduler experiences configured for booking flows.

Parameters

This endpoint does not accept parameters.

Returns

Default Response

Content type: application/json

Status: 200

Example request
                
                    
                    curl -X GET "http://localhost:8080/scheduler/experiences"
                  
              
Example response 200

No example response available.


POST /scheduler/experiences

Create scheduler experience

Create a new scheduler experience pointing to your availability and booking callbacks.

Parameters

This endpoint does not accept parameters.

Request body

Required • application/json

Request body (application/json)

post-/scheduler/experiences-request-body-application/json

object<{ slug, name, description, … }>
Field Type Description Values
availability Optional object<{ timezone, openHours, overrides, … }>
availabilityEndpoint Optional object<{ url, method, headers, … }>
bookingEndpoint Optional object<{ url, method, headers, … }>
bookingForm Optional object<{ title, description, submitButtonLabel, … }>
defaultAccountIds Optional array<string>
unique items
description Optional string
isActive Optional boolean
metadata Optional object
name Required string
min length 1
routingEndpoint Optional object<{ url, method, headers, … }>
slug Required string
pattern ^[a-z0-9-]{3,64}$
timezone Optional string
ui Optional object<{ theme, layout, copy, … }>

Returns

Default Response

Content type: application/json

Status: 201

Example request
                
                    
                    curl -X POST "http://localhost:8080/scheduler/experiences" \
                  
                    
                      -H "Content-Type: application/json"
                  
              
Example response 201

No example response available.


GET /scheduler/experiences/{slug}

Get scheduler experience

Fetch a single scheduler experience by slug.

Parameters

slug string

In path Required

Returns

Default Response

Content type: application/json

Status: 200

Example request
                
                    
                    curl -X GET "http://localhost:8080/scheduler/experiences/{slug}"
                  
              
Example response 200

No example response available.


PATCH /scheduler/experiences/{slug}

Update scheduler experience

Update configuration for an existing scheduler experience.

Parameters

slug string

In path Required

Request body

Optional • application/json

Request body (application/json)

patch-/scheduler/experiences/{slug}-request-body-application/json

object<{ name, description, timezone, … }>
Field Type Description Values
availability Optional
availabilityEndpoint Optional
bookingEndpoint Optional
bookingForm Optional
defaultAccountIds Optional
description Optional
isActive Optional boolean
metadata Optional
name Optional string
min length 1
routingEndpoint Optional
timezone Optional
ui Optional

Returns

Default Response

Content type: application/json

Status: 200

Example request
                
                    
                    curl -X PATCH "http://localhost:8080/scheduler/experiences/{slug}" \
                  
                    
                      -H "Content-Type: application/json"
                  
              
Example response 200

No example response available.


POST /scheduler/experiences/{slug}/availability

Resolve availability via callback

Call the configured availability callback for a scheduler experience and return available slots.

Parameters

slug string

In path Required

Request body

Required • application/json

Request body (application/json)

post-/scheduler/experiences/{slug}/availability-request-body-application/json

object<{ range, durationMinutes, intervalMinutes, … }>
Field Type Description Values
attendees Optional array<object<{ id, email, displayName, … }>>
bookingFormResponse Optional object
constraints Optional object
durationMinutes Required number
≥ 5
intervalMinutes Optional number
≥ 5
metadata Optional object
range Required object<{ start, end, timezone }>
timezone Optional string

Returns

Default Response

Content type: application/json

Status: 200

Example request
                
                    
                    curl -X POST "http://localhost:8080/scheduler/experiences/{slug}/availability" \
                  
                    
                      -H "Content-Type: application/json"
                  
              
Example response 200

No example response available.


POST /scheduler/experiences/{slug}/bookings

Create booking via callback

Call the configured booking callback for a scheduler experience to finalize a meeting.

Parameters

slug string

In path Required

Request body

Required • application/json

Request body (application/json)

post-/scheduler/experiences/{slug}/bookings-request-body-application/json

object<{ slot, guest, attendees, … }>
Field Type Description Values
attendees Optional array<object<{ id, email, displayName, … }>>
guest Required object<{ email, name, timezone, … }>
metadata Optional object
responses Optional object
slot Required

Returns

Default Response

Content type: application/json

Status: 201

Example request
                
                    
                    curl -X POST "http://localhost:8080/scheduler/experiences/{slug}/bookings" \
                  
                    
                      -H "Content-Type: application/json"
                  
              
Example response 201

No example response available.

When an experience has an availabilityEndpoint, Riposte POSTs every slot lookup to your service using the SchedulerAvailabilityCallbackPayload structure. The payload includes the experience context plus the visitor’s exact filter: date range, durationMinutes, optional attendees, booking-form answers, and any metadata you attached while proxying the widget request.

Your handler must return a SchedulerAvailabilityResponse with a generatedAt timestamp and at least one slots entry (or an explicit empty array). If generatedAt is missing the widget refuses to render and logs generatedAt is required.

import type {
SchedulerAvailabilityCallbackPayload,
SchedulerAvailabilityResponse,
} from '@riposte.co/server/dist/src/scheduler/types'
app.post('/callbacks/riposte/availability', async (req, res) => {
const payload = req.body as SchedulerAvailabilityCallbackPayload
const { request, experience } = payload
const computedAt = new Date()
const slots = await buildAvailability({
range: request.range,
durationMinutes: request.durationMinutes,
attendees: request.attendees,
metadata: request.metadata,
experience,
})
const response: SchedulerAvailabilityResponse = {
generatedAt: computedAt.toISOString(),
expiresAt: new Date(computedAt.getTime() + 5 * 60 * 1000).toISOString(),
timezone: request.timezone ?? request.range.timezone ?? experience.timezone ?? 'UTC',
slots: slots.map((slot) => ({
start: slot.start,
end: slot.end,
timezone: slot.timezone ?? request.timezone ?? experience.timezone ?? 'UTC',
participants: slot.participants,
metadata: {
hostAccountId: slot.hostAccountId,
...slot.metadata,
},
})),
}
res.status(200).json(response)
})

Recommendations:

  • generatedAt: ISO-8601 string describing when you computed the response; we use it in cache validation.
  • expiresAt: optional ISO-8601 string that forces the widget to refresh stale results (commonly 3–5 minutes after generatedAt).
  • metadata: attach any routing data (for example, hostAccountId) so the booking callback can persist who owned the slot.