Skip to content
Keptslot
Start free

Read the settings

GET
/v1/workspace
curl --request GET \
--url https://api.keptslot.com/v1/workspace \
--header 'Authorization: Bearer <token>'

This endpoint gives the settings of the workspace the key belongs to.

The workspace settings.

Media type application/json
object
slug
required

Read only. It is the workspace address on the booking page.

string
name
required
string
timezone
required

An IANA zone name. Every time the API gives back uses this zone.

string
currency
required
string
require_booking_verification
required

True when a new booking waits on a 6-digit code. Read the status on the create response to decide what happens next. Do not decide it from this field.

boolean
self_hosted_booking_frontend

“Custom booking frontend” in the dashboard. When true, bookings made with this workspace’s publishable keys need no Turnstile token, which a booking page on your own site cannot produce. The rate limits and the daily booking limit still apply.

boolean
customer_messages
required

“Customer messages” in the dashboard. True by default. When false, Keptslot sends this workspace’s customers no confirmation, verification code, payment pending, reminder, reschedule, cancellation or refund message, by email or by SMS. The webhook events then tell you which of those messages to send yourself. Staff messages keep their own settings, staff_alerts and staff_reminders_enabled.

boolean
online_bookings_paused

True while the business has paused online bookings (“Pause online bookings” in the dashboard). False by default. Set it with PATCH /v1/workspace; the public workspace response reports it too.

While it is true, creating a booking, reading availability and moving a booking through /v1 answer 409 with error.type bookings_paused, for both key types. Cancelling, verifying and confirming still work.

boolean
manage_url_template

Where the manage links in our emails and calendar files send customers, with {token} where the booking’s access token goes. For example, https://example.com/manage/{token}. Null means the links go to the Keptslot booking page.

It must be an https address of at most 500 characters, with {token} in it exactly once and not in the domain. Send "" to clear it.

string | null
sms_enabled
required

The master text-message switch. False means this workspace sends no SMS at all, whatever the five per-type switches say.

boolean
sms_confirmation
required

Whether each message type may go out by SMS as well as email. Each is subordinate to sms_enabled – both must be true. Confirmation and staff reminder default false: the confirmation email arrives seconds after the booking, and the staff reminder is a second charged message per booking to a person who is not the customer.

boolean
sms_reminder
required
boolean
sms_cancellation
required
boolean
sms_reschedule
required
boolean
sms_staff_reminder
required
boolean
staff_alerts
required

Who gets the alert when a booking changes.

string
staff_reminders_enabled
required
boolean
staff_reminder_offset_minutes
required

How long before the start time the staff reminder is sent.

integer
reminder_offset_minutes
required

How long before the start time the customer reminder is sent.

integer
slot_interval_minutes
required

The step between the slots that availability offers.

integer
booking_policy

Plain text shown to customers. Render it as text. Do not render it as markup.

string | null
vertical
required

Selects the customer-facing words. It changes copy only. It never changes booking mechanics.

string
contact_email
string | null
contact_phone
string | null
address

The business’s street address. Published by presence on both customer-facing workspace payloads (public bootstrap and manage), the same as contact_email and contact_phone.

string | null
blurb

A short line about the business, under its name on the booking page. At most 200 characters. Send "" to clear it.

string | null
refund_policy

The refund terms, shown where a customer pays. At most 2000 characters. Separate from booking_policy: one governs whether an appointment can be moved, the other governs money.

string | null
terms_url

The business’s own terms, shown alongside ours. Must be http or https – anything else is refused. A bare domain is accepted and stored as https://.

string | null
website_url
string | null
instagram_url

A handle such as @riverwood is accepted and stored as the full profile URL.

string | null
maps_url
string | null
confirmation_note

Shown on the confirmation screen after a booking succeeds, and in the confirmation, reschedule and reminder emails. What to bring, where to park, the door code. At most 500 characters.

string | null
social_title

At most 70 characters.

string | null
social_description

At most 160 characters.

string | null
allow_staff_choice

Whether customers pick who they see. True by default, so a workspace that never touches it keeps today’s behaviour.

boolean
theme

The booking page’s look. A change merges into what is stored: send only the keys to change. preset is one of warm, clinical, bold or soft; accent is a colour such as #0E7490, or null to clear it; cover_position is top, center or bottom.

object
preset
string
Allowed values: warm clinical bold soft
accent
string | null
cover_position
string
Allowed values: top center bottom
Example
{
"theme": {
"preset": "warm",
"cover_position": "top"
}
}

The key is missing, malformed or revoked.

Media type application/json
object
error
required
object
type
required

A stable machine-readable code. Match on this.

string
message
required

A sentence for a person. Do not match on this.

string
param

The field that caused the refusal, if one field did.

string
dimension

The plan limit that refused the request. It is present only on a 402, and only for a secret key or an account key. See the errors guide.

string
used

The current count for that dimension. It is present only on a 402, and only for an account key. It is absent when the refusal has no count to report. Absent and zero are different answers.

integer format: int64
limit

The cap for that dimension. It is present only on a 402, and only for an account key. A cap of zero is a real value.

integer format: int64
Example generated
{
"error": {
"type": "example",
"message": "example",
"param": "example",
"dimension": "example",
"used": 1,
"limit": 1
}
}

This is a server route and you sent a publishable key. Send a secret key from your server. The type field is secret_key_required.

Media type application/json
object
error
required
object
type
required

A stable machine-readable code. Match on this.

string
message
required

A sentence for a person. Do not match on this.

string
param

The field that caused the refusal, if one field did.

string
dimension

The plan limit that refused the request. It is present only on a 402, and only for a secret key or an account key. See the errors guide.

string
used

The current count for that dimension. It is present only on a 402, and only for an account key. It is absent when the refusal has no count to report. Absent and zero are different answers.

integer format: int64
limit

The cap for that dimension. It is present only on a 402, and only for an account key. A cap of zero is a real value.

integer format: int64
Example generated
{
"error": {
"type": "example",
"message": "example",
"param": "example",
"dimension": "example",
"used": 1,
"limit": 1
}
}

A fault on our side. Do not retry the same request in a loop. The type field is internal_error.

Media type application/json
object
error
required
object
type
required

A stable machine-readable code. Match on this.

string
message
required

A sentence for a person. Do not match on this.

string
param

The field that caused the refusal, if one field did.

string
dimension

The plan limit that refused the request. It is present only on a 402, and only for a secret key or an account key. See the errors guide.

string
used

The current count for that dimension. It is present only on a 402, and only for an account key. It is absent when the refusal has no count to report. Absent and zero are different answers.

integer format: int64
limit

The cap for that dimension. It is present only on a 402, and only for an account key. A cap of zero is a real value.

integer format: int64
Example generated
{
"error": {
"type": "example",
"message": "example",
"param": "example",
"dimension": "example",
"used": 1,
"limit": 1
}
}