Offerings
Offerings in Allpage: its screens, what you can do there and its operations.
Availability. Works when the business has it turned on and its plan includes it. Otherwise its tools answer needs (kind module) with how to turn it on: business.useTool, or a plan that includes it.
Screens
- Schedule (/schedule)
What you can do
- Set up an offering: the assistant asks you first
- Add sessions to an offering: the assistant asks you first
- Archive an offering: the assistant asks you first
- Book a place: the assistant can do it on its own
- Cancel a booking: the assistant can do it on its own
- Move a booking: the assistant can do it on its own
- Note on a booking: the assistant can do it on its own
- Get the link for a step a booking needs: the assistant can do it on its own
- Book a time: the assistant can do it on its own
- Accept a booking request: the assistant asks you first
- Decline a booking request: the assistant asks you first
- Book a standing time: the assistant can do it on its own
- End a standing booking: the assistant asks you first
- Mark attendance: the assistant can do it on its own
- Check in: the assistant can do it on its own
- Change a session: the assistant asks you first
- Change how many a session holds: the assistant asks you first
- Put someone on a session: the assistant asks you first
- Call off a session: the assistant can prepare it and you confirm it, twice, unless it runs under a policy you accepted
- Change a repeating schedule from a date: the assistant asks you first
- Choose the headings on your booking page: the assistant asks you first
- Put your offerings in order: the assistant asks you first
Automations you can turn on
- Booking reminders: Reminds each customer before every session they’re booked into, including each one of a series
- New booking alerts: Tells you when someone books, by push, text or email
- New customer welcome: Sends a short series after someone’s first visit, until they buy a pack or membership
- Rebooking reminders: Asks customers to book again a set time after a visit, if they haven’t already
- Win-back: Invites customers back when they haven’t come in a while, counted from their last visit
For apps
Tools
- booking_save (Set up an offering): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_addSessions (Add sessions to an offering): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_archive (Archive an offering): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_enroll (Book a place): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_cancelEnrollment (Cancel a booking): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_transfer (Move a booking): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_note (Note on a booking): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_requirementLink (Get the link for a step a booking needs): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_book (Book a time): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_accept (Accept a booking request): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_decline (Decline a booking request): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_bookStanding (Book a standing time): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_endStanding (End a standing booking): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_markAttendance (Mark attendance): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_checkIn (Check in): a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
- booking_changeSession (Change a session): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_setCapacity (Change how many a session holds): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_assignStaff (Put someone on a session): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_callOffSession (Call off a session): waits for the owner to confirm it in Allpage, unless it runs under a policy they accepted
- booking_editPattern (Change a repeating schedule from a date): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_saveBookingPage (Choose the headings on your booking page): customers see it: waits for the owner’s approval unless they chose Just do it for your app
- booking_reorder (Put your offerings in order): customers see it: waits for the owner’s approval unless they chose Just do it for your app
Reads
- booking_standing (See standing bookings)
- booking_list (See your offerings)
- booking_get (Look up an offering)
- booking_sessions (See your sessions)
- booking_roster (See who’s coming to a session)
- booking_enrollment (Look up a booking)
- booking_places (See an offering’s bookings by day)
- booking_times (Open times on a date)
- booking_days (Dates with open times)
- booking_report (See how your offerings and teachers did)
- booking_reportExport (Download a report on your offerings)
- booking_sessionTotals (See how your sessions went)
- booking_onSale (Check whether anything is on sale to book)
- booking_bookable (What you can book)
- booking_openSessions (Sessions you can book)
- booking_booking (See a booking)
- booking_shapes (See the kinds of offering you can set up)
- booking_preview (Preview an offering before saving)
- booking_upcoming (Sessions coming up)
- booking_calendar (Your public calendar)
- booking_coverage (What can pay for a booking)
- booking_requirements (See what each admission asks for)
- booking_coveredBookings (Bookings a membership pays for)
- booking_bookingPage (See the headings on your booking page)
- booking_customerVisits (See what a customer has coming up)
- booking_sessionPay (See how a session’s places are paid)
- booking_summary (What’s going on)
The owner’s screens
- Schedule (/schedule)
Automations the owner can turn on
- Booking reminders: Reminds each customer before every session they’re booked into, including each one of a series
- New booking alerts: Tells you when someone books, by push, text or email
- New customer welcome: Sends a short series after someone’s first visit, until they buy a pack or membership
- Rebooking reminders: Asks customers to book again a set time after a visit, if they haven’t already
- Win-back: Invites customers back when they haven’t come in a while, counted from their last visit
Operations
Each one's input and output, as JSON Schema. Ids are typed (typed ids).
offerings.accept
Accept a booking request
- Kind
- Change
- Tool
booking_accept- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
}
},
"required": [
"enrollmentId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.addSessions
Add sessions to an offering
- Kind
- Change
- Tool
booking_addSessions- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offering": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The offering's name, as the owner says it, or its id."
},
"dates": {
"description": "One-off sessions.",
"maxItems": 366,
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The date, YYYY-MM-DD."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Start time, 24-hour, like \"19:00\"."
},
"durationMinutes": {
"type": "integer",
"minimum": 1,
"maximum": 1440,
"description": "How long it runs, in minutes."
}
},
"required": [
"date",
"startMinute",
"durationMinutes"
],
"additionalProperties": false
}
},
"patterns": {
"description": "Repeating sessions: a weekly or monthly rule, as booking_shapes shows. To change one already running, use booking_editPattern.",
"maxItems": 20,
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "week"
},
"interval": {
"default": 1,
"description": "Every n weeks: 1 is weekly, 2 is every other week.",
"type": "integer",
"minimum": 1,
"maximum": 52
},
"days": {
"minItems": 1,
"maxItems": 7,
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"description": "Days of the week: 0 is Sunday, 1 Monday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"days",
"startMinute",
"from"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "month"
},
"interval": {
"default": 1,
"description": "Every n months.",
"type": "integer",
"minimum": 1,
"maximum": 12
},
"nth": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
},
{
"type": "number",
"const": -1
}
],
"description": "Which one in the month: 1 to 4, or -1 for the last."
},
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6,
"description": "The day: 0 is Sunday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"nth",
"weekday",
"startMinute",
"from"
],
"additionalProperties": false
}
]
}
}
},
"required": [
"offering"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.archive
Archive an offering
- Kind
- Change
- Tool
booking_archive- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
}
},
"required": [
"offeringId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.assignStaff
Put someone on a session
- Kind
- Change
- Tool
booking_assignStaff- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The person: the owner’s calendar or a team member, from the team list. A resource id: res_ and 26 letters and digits."
},
"role": {
"default": "substitute",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
},
"replaces": {
"description": "Who they stand in for, taken off the session.",
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$"
}
},
"required": [
"sessionId",
"resourceId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.book
Book a time
- Kind
- Change
- Tool
booking_book- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The admission to book, from offerings.get: the single-time one of an offering customers pick a time for. A admission id: adm_ and 26 letters and digits."
},
"start": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"description": "The start time, from offerings.times."
},
"resourceId": {
"description": "Who it’s with, from offerings.times; the first person free then when left out.",
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$"
},
"addOns": {
"default": [],
"description": "Add-ons from the offering’s add-ons (offerings.bookable), as product ids, each once. A service adds its minutes to the booking: pass the same ones to offerings.times so the time fits. Each is charged as its own line of the sale, even when a pack or membership pays for the booking; an item sells only while it has stock.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
}
},
"customerId": {
"description": "Someone on your list, from customers_search.",
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "Their name, without a customerId.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
},
"attendees": {
"description": "Who goes: one place each, all in one checkout.",
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"default": "self",
"description": "self (the buyer goes), guest (named here) or dependent (a child or pet, by dependentId from customers_dependents).",
"type": "string",
"enum": [
"self",
"guest",
"dependent"
]
},
"dependentId": {
"description": "For a dependent: who, from customers.dependents.",
"type": "string",
"pattern": "^dep_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "For a guest: their name.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
},
"amountMinor": {
"description": "For pay what you want: the amount picked, in cents.",
"type": "integer",
"minimum": 0,
"maximum": 100000000
}
},
"additionalProperties": false
}
},
"seats": {
"default": 1,
"description": "How many people each place is for (a party): one named attendee and the rest as their guests.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"pay": {
"default": "card",
"description": "card: paid online now, or from a pay link held 48 hours when the business books it; door: paid in person at the visit.",
"type": "string",
"enum": [
"card",
"door"
]
},
"more": {
"default": [],
"description": "A visit: more services after the first, back to back in this order, each starting when the one before it ends. Pass the same parts to offerings.times (`parts`) and book a start it answered. Every part books or none does: one sale with each part its own line, and a pack or membership pays any part it covers. Not when a part’s offering takes a form or approval before booking.",
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The next service’s option: the single-time admission of another offering customers pick a time for, from offerings.bookable. A admission id: adm_ and 26 letters and digits."
},
"resourceId": {
"description": "Who takes this part; whoever the search places when left out.",
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$"
},
"addOns": {
"default": [],
"description": "This part’s add-ons, as for the first.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
}
}
},
"required": [
"admissionId"
],
"additionalProperties": false
}
},
"grantId": {
"description": "The pack or membership that pays, from offerings.coverage. Left out, the one that costs them least is used when one covers it; none pays by card or at the door instead.",
"anyOf": [
{
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A grant id: grt_ and 26 letters and digits."
},
{
"type": "string",
"const": "none"
}
]
},
"taxZip": {
"label": "ZIP code",
"description": "Their ZIP code, to pay by card at a business that collects sales tax (`askZip` on offerings.review). Left out for someone who gave one here before.",
"type": "string",
"maxLength": 20
},
"codes": {
"default": [],
"description": "Codes they typed, like SPRING10.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
},
"tender": {
"default": [],
"description": "Gift cards (by `code`) and store credit they hold (by `grantId`) that pay first; a card or the door pays the rest. Not with a payment plan.",
"maxItems": 5,
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"required": [
"code"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"grantId": {
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A gift card or store credit they hold, from commerce.storedValue. A grant id: grt_ and 26 letters and digits."
}
},
"required": [
"grantId"
],
"additionalProperties": false
}
]
}
},
"textReminders": {
"default": false,
"description": "They ticked the consent to text reminders about this booking; needs their mobile (`phone`).",
"type": "boolean"
},
"landing": {
"description": "Where the visit that booked came from, for attribution.",
"type": "object",
"properties": {
"r": {
"default": "",
"type": "string",
"maxLength": 500
},
"q": {
"default": "",
"type": "string",
"maxLength": 500
}
},
"additionalProperties": false
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "A fresh random id you make for each new request. Send the same one again only to retry that exact request; a different request with it is refused."
}
},
"required": [
"admissionId",
"start",
"requestId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.bookable
What you can book
- Kind
- Read
- Tool
booking_bookable- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"description": "One offering, by its id; leave out for everything on sale.",
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$"
}
},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"offerings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"kind": {
"type": "string",
"enum": [
"class",
"course",
"workshop",
"event",
"camp",
"exhibition",
"appointment",
"rental",
"open_hours",
"day_care"
]
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"timeZone": {
"type": "string",
"description": "Where its sessions are."
},
"place": {
"description": "Where it is: the location’s name and address, Online, or the business’s address.",
"type": [
"string",
"null"
]
},
"onDemand": {
"type": "boolean",
"description": "Customers pick a time (offerings.times), not a session."
},
"minutes": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "One customers pick a time for: its shortest option’s length. Each option’s own is on its admission (`durationMinutes`)."
},
"staff": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
}
},
"required": [
"id",
"name"
],
"additionalProperties": false
},
"description": "One customers pick a time for: who customers can ask for, for any of its options. An option with people of its own lists them on its admission (`staff`)."
},
"equipment": {
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"link": {
"type": "string",
"maxLength": 2000,
"format": "uri"
}
},
"required": [
"name"
],
"additionalProperties": false
},
"description": "What to bring."
},
"admissions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A admission id: adm_ and 26 letters and digits."
},
"productId": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"selector": {
"type": "string",
"enum": [
"one",
"all",
"set",
"flex"
],
"description": "one: a session they pick; all or set: the whole series; flex: a number of sessions to pick later."
},
"name": {
"type": "string",
"description": "What it’s called on the booking page."
},
"price": {
"type": "string",
"description": "The price in commerce’s words: \"$25\", \"Free\"."
},
"priceMinor": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"payWhatYouWant": {
"anyOf": [
{
"type": "object",
"properties": {
"minMinor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"suggestedMinor": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"maxMinor": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"minMinor",
"suggestedMinor",
"maxMinor"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "They pick what they pay, per person, within these."
},
"payHint": {
"description": "Pay what you want in words: \"Suggested $25. Pay at least $10.\"",
"type": [
"string",
"null"
]
},
"online": {
"type": "boolean",
"description": "Paid by card when booking."
},
"dueNow": {
"type": "string",
"description": "What’s due when booking, in plain words."
},
"later": {
"description": "What’s left after booking.",
"type": [
"string",
"null"
]
},
"flexCount": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"durationMinutes": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "An option customers pick a time for: how long it runs, from its product. Null for anything else."
},
"staff": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
}
},
"required": [
"id",
"name"
],
"additionalProperties": false
},
"description": "An option customers pick a time for: who customers can ask for it, its own people or else the offering’s. Empty for anything else."
},
"sessions": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "A series: how many sessions still to come it covers."
},
"first": {
"description": "A series: when its first session still to come starts.",
"type": [
"string",
"null"
]
},
"onSale": {
"type": "boolean",
"description": "A series is on sale only while every session still to come has room."
},
"full": {
"type": "array",
"items": {
"type": "string"
},
"description": "A series off sale: the sessions that are full."
}
},
"required": [
"id",
"productId",
"selector",
"name",
"price",
"priceMinor",
"payWhatYouWant",
"payHint",
"online",
"dueNow",
"later",
"flexCount",
"durationMinutes",
"staff",
"sessions",
"first",
"onSale",
"full"
],
"additionalProperties": false
}
},
"addOns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"productId": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"service",
"item"
],
"description": "service: adds its minutes to the booking; item: handed over at the visit."
},
"minutes": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "A service: the minutes it adds. Null for an item."
},
"price": {
"type": "string",
"description": "Its price in commerce’s words: \"$20\"."
},
"priceMinor": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"soldOut": {
"type": "boolean",
"description": "An item with no stock left: show it, but it can’t be picked until it’s back in stock."
}
},
"required": [
"productId",
"name",
"kind",
"minutes",
"price",
"priceMinor",
"soldOut"
],
"additionalProperties": false
},
"description": "One customers pick a time for: what they can add to a booking, in the owner’s order, for `addOns` on offerings.times, offerings.review and offerings.book. Each is charged as its own line, even when a pack or membership pays for the option. Empty for anything else."
}
},
"required": [
"id",
"kind",
"name",
"description",
"timeZone",
"place",
"onDemand",
"minutes",
"staff",
"equipment",
"admissions",
"addOns"
],
"additionalProperties": false
},
"description": "In the owner’s order of offerings."
},
"groups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"tag": {
"type": "string"
},
"heading": {
"type": "string",
"description": "The heading the page shows: \"Massage\"."
},
"offeringIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"description": "Its offerings, each its own row, in the owner’s order."
}
},
"required": [
"tag",
"heading",
"offeringIds"
],
"additionalProperties": false
},
"description": "Headings on the booking page, in order. Offerings in no group show after them."
},
"policies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"cancellation",
"no_show",
"deposit",
"waitlist",
"call_off",
"refund"
]
},
"text": {
"type": "string"
}
},
"required": [
"kind",
"text"
],
"additionalProperties": false
},
"description": "The cancellation and no-show policies a booking is sold under."
}
},
"required": [
"offerings",
"groups",
"policies"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.booking
See a booking
- Kind
- Read
- Tool
booking_booking- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
}
},
"required": [
"enrollmentId"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "The offering."
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
},
"statusWords": {
"type": [
"string",
"null"
]
},
"who": {
"description": "Who goes, when it isn’t the one looking: a guest’s or a dependent’s name.",
"type": [
"string",
"null"
]
},
"due": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "For offerings.requirementLink: a fresh link to it."
},
"label": {
"type": "string",
"description": "\"Sign the Studio waiver for Sam\"."
},
"status": {
"type": "string",
"description": "\"Studio waiver for Sam due by Sat, Oct 3\"."
},
"by": {
"description": "For a deadline: the date.",
"type": [
"string",
"null"
]
}
},
"required": [
"key",
"label",
"status",
"by"
],
"additionalProperties": false
},
"description": "Forms or records it still waits on; check-in waits until they’re in."
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"when": {
"description": "When it is: the session still to come (the first of a series), else the last.",
"type": [
"string",
"null"
]
},
"place": {
"description": "Where: the location’s name and address, or Online.",
"type": [
"string",
"null"
]
},
"mapUrl": {
"description": "Directions to the place.",
"type": [
"string",
"null"
]
},
"money": {
"description": "What’s left to pay and how, or that it’s paid: \"Pay $25 at your visit\".",
"type": [
"string",
"null"
]
},
"paid": {
"type": "boolean",
"description": "Something was paid for it, which moves with it when it moves."
},
"timeZone": {
"type": "string"
},
"series": {
"type": "boolean",
"description": "A place in every session of a series."
},
"onDemand": {
"type": "boolean",
"description": "A time they picked, not a scheduled session."
},
"sessions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"start": {
"type": "number"
},
"end": {
"type": "number"
},
"when": {
"type": "string"
},
"calledOff": {
"type": "boolean"
},
"attendance": {
"anyOf": [
{
"type": "string",
"enum": [
"expected",
"attended",
"no_show",
"excused",
"called_off"
]
},
{
"type": "null"
}
]
},
"checkIn": {
"type": "string",
"enum": [
"not_yet",
"open",
"done",
"closed"
]
},
"checkInUrl": {
"description": "Their own check-in link, while check-in is open.",
"type": [
"string",
"null"
]
}
},
"required": [
"sessionId",
"start",
"end",
"when",
"calledOff",
"attendance",
"checkIn",
"checkInUrl"
],
"additionalProperties": false
}
},
"holdUntil": {
"description": "A spot held for them: pay by then.",
"type": [
"string",
"null"
]
},
"cancel": {
"anyOf": [
{
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "The button: \"Cancel and refund $30\"."
},
"confirm": {
"type": "string",
"description": "What the confirmation asks."
},
"refundMinor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"words": {
"description": "Where the money goes.",
"type": [
"string",
"null"
]
},
"reduced": {
"description": "What comes off payments still to come.",
"type": [
"string",
"null"
]
},
"remaining": {
"type": "array",
"items": {
"type": "object",
"properties": {
"when": {
"type": "string"
},
"amount": {
"type": "string"
}
},
"required": [
"when",
"amount"
],
"additionalProperties": false
}
}
},
"required": [
"label",
"confirm",
"refundMinor",
"words",
"reduced",
"remaining"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Null when it can’t be cancelled online."
},
"canMove": {
"type": "boolean",
"description": "It can move: to another session of the same offering, or for a booked time (onDemand), to another open time (offerings.transfer with toStart)."
},
"canHandOver": {
"type": "boolean",
"description": "Someone else can go in their place."
},
"visit": {
"anyOf": [
{
"type": "object",
"properties": {
"parts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "The service."
},
"sessionId": {
"anyOf": [
{
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"start": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
]
},
"when": {
"type": "string",
"description": "When it starts: \"Thu, Oct 8 at 10:45 AM\"."
},
"time": {
"type": "string",
"description": "Its start time: \"10:45 AM\"."
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How long it runs."
},
"staff": {
"description": "Who takes it.",
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
}
},
"required": [
"enrollmentId",
"offeringId",
"name",
"sessionId",
"start",
"when",
"time",
"minutes",
"staff",
"status"
],
"additionalProperties": false
},
"description": "Every part in the order it runs, cancelled ones included."
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How long the parts still on run, back to back."
},
"total": {
"type": "string",
"description": "The list price of the parts still on, each option with its add-ons, before discounts, packs and memberships: \"$100\"."
}
},
"required": [
"parts",
"minutes",
"total"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Part of a visit (several services back to back in one checkout): every part. Moving any part moves the whole visit, and cancelling cancels every part."
}
},
"required": [
"enrollmentId",
"offeringId",
"name",
"status",
"statusWords",
"who",
"due",
"seats",
"when",
"place",
"mapUrl",
"money",
"paid",
"timeZone",
"series",
"onDemand",
"sessions",
"holdUntil",
"cancel",
"canMove",
"canHandOver",
"visit"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.bookingPage
See the headings on your booking page
- Kind
- Read
- Tool
booking_bookingPage- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"groups": {
"type": "array",
"items": {
"type": "string"
},
"description": "The tags you chose as headings, in order; empty when the page uses the default (each offering under its first tag, in the order of your offerings)."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every tag on your running offerings, in the order of your offerings: what headings can be."
}
},
"required": [
"groups",
"tags"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.bookStanding
Book a standing time
- Kind
- Change
- Tool
booking_bookStanding- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The single-visit admission to book every week, from offerings.get. A admission id: adm_ and 26 letters and digits."
},
"days": {
"minItems": 1,
"maxItems": 7,
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"description": "Days of the week, 0 = Sunday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Start time, in minutes past midnight in the offering’s zone."
},
"every": {
"default": 1,
"description": "Every n weeks: 1 is weekly, 2 every other week.",
"type": "integer",
"minimum": 1,
"maximum": 4
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on."
},
"until": {
"description": "The last date; leave out to keep it going.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"resourceId": {
"description": "Who runs it, for an offering customers pick a time for; the first person free on the first date when left out.",
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$"
},
"customerId": {
"description": "Someone on your list, from customers_search.",
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "Their name, without a customerId.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
},
"attendee": {
"description": "Who goes: the buyer, a guest named here, or one of their dependents.",
"type": "object",
"properties": {
"kind": {
"default": "self",
"description": "self (the buyer goes), guest (named here) or dependent (a child or pet, by dependentId from customers_dependents).",
"type": "string",
"enum": [
"self",
"guest",
"dependent"
]
},
"dependentId": {
"description": "For a dependent: who, from customers.dependents.",
"type": "string",
"pattern": "^dep_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "For a guest: their name.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
}
},
"additionalProperties": false
},
"seats": {
"default": 1,
"description": "How many people each place is for (a party): one named attendee and the rest as their guests.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"pay": {
"default": "card",
"description": "card: paid online (or from a pay link); door: paid in person.",
"type": "string",
"enum": [
"card",
"door"
]
},
"codes": {
"default": [],
"description": "Codes they typed, like SPRING10.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
},
"agreeToRenewal": {
"default": false,
"description": "The customer ticked the separate OK for something billed again and again (a term billed monthly), to the words commerce.previewSale showed.",
"type": "boolean"
},
"termsVersion": {
"description": "The termsVersion from commerce.previewSale they agreed to.",
"type": "string",
"maxLength": 80
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "A fresh random id you make for each new request. Send the same one again only to retry that exact request; a different request with it is refused."
}
},
"required": [
"admissionId",
"days",
"startMinute",
"from",
"requestId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.calendar
Your public calendar
- Kind
- Read
- Tool
booking_calendar- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"days": {
"default": 120,
"type": "integer",
"minimum": 1,
"maximum": 365
}
},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"timeZone": {
"type": "string"
},
"location": {
"type": "string",
"description": "The business’s address, when it shows."
},
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"start": {
"type": "number",
"description": "Epoch milliseconds."
},
"end": {
"type": "number",
"description": "Epoch milliseconds."
},
"slug": {
"type": "string",
"description": "Its address under the events page."
},
"changedAt": {
"type": "number",
"description": "Epoch milliseconds."
}
},
"required": [
"id",
"name",
"description",
"start",
"end",
"slug",
"changedAt"
],
"additionalProperties": false
}
}
},
"required": [
"timeZone",
"location",
"events"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.callOffSession
Call off a session
- Kind
- Change
- Tool
booking_callOffSession- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
waits for the owner to confirm it in Allpage, unless it runs under a policy they accepted
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"give": {
"default": "refund",
"description": "refund: card payments get the session’s share back (drop-ins in full); make_up: they get a credit for another session of the offering instead. Pack credits always come back.",
"type": "string",
"enum": [
"refund",
"make_up"
]
},
"note": {
"default": "",
"description": "A line for the people booked, like “Maya is out sick.”",
"type": "string",
"maxLength": 500
}
},
"required": [
"sessionId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.cancelEnrollment
Cancel a booking
- Kind
- Change
- Tool
booking_cancelEnrollment- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"refund": {
"default": "policy",
"description": "The business only: policy (what the cancellation policy gives back, the default), all, or none. Customers always get the policy.",
"type": "string",
"enum": [
"policy",
"all",
"none"
]
},
"part": {
"default": false,
"description": "The business only, for a visit: cancel just this part. Its line and add-ons end under the booking’s policy, its time opens again, and the other parts stay booked. Otherwise every part of the visit is cancelled; customers always cancel the whole visit.",
"type": "boolean"
}
},
"required": [
"enrollmentId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.changeSession
Change a session
- Kind
- Change
- Tool
booking_changeSession- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The session, from booking_sessions. A session id: ses_ and 26 letters and digits."
},
"date": {
"description": "Move it to this date, in its location’s time zone.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"startMinute": {
"description": "Move it to this start time, in minutes past midnight.",
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
]
},
"durationMinutes": {
"description": "Its new length. Left out, it keeps its length.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"locationId": {
"description": "Hold it somewhere else; null is the main location.",
"anyOf": [
{
"type": "string",
"pattern": "^loc_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A location id: loc_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"resources": {
"description": "The rooms and equipment it holds instead of its own: one, or any free one of a group.",
"maxItems": 10,
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A room or equipment, from resources_list. A resource id: res_ and 26 letters and digits."
}
},
"required": [
"resourceId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"groupId": {
"type": "string",
"pattern": "^rgp_[0-9a-hjkmnp-tv-z]{26}$",
"description": "Any free one of a group, from resources_list. A resource group id: rgp_ and 26 letters and digits."
}
},
"required": [
"groupId"
],
"additionalProperties": false
}
]
}
},
"capacity": {
"description": "How many people it holds. Never fewer than are booked.",
"type": "integer",
"minimum": 1,
"maximum": 10000
},
"staff": {
"description": "Everyone who runs it, replacing who does now.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The person: the owner’s calendar or a team member, from the team list. A resource id: res_ and 26 letters and digits."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
},
"note": {
"description": "A line for the people booked, like “We’re in Studio B this week.”",
"type": "string",
"maxLength": 500
}
},
"required": [
"sessionId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.checkIn
Check in
- Kind
- Change
- Tool
booking_checkIn- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"token": {
"description": "From the customer’s own check-in link.",
"type": "string",
"maxLength": 500
},
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"code": {
"description": "The session’s code shown at the location, with sessionId.",
"type": "string",
"pattern": "^\\d{6}$"
},
"enrollmentId": {
"description": "Staff: who to check in, with sessionId.",
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$"
},
"door": {
"description": "Staff at the door: book a walk-in into sessionId and check them in.",
"type": "object",
"properties": {
"admissionId": {
"description": "Left out: the offering’s single-session admission.",
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$"
},
"customerId": {
"description": "Someone on your list, from customers_search.",
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "Their name, without a customerId.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
},
"seats": {
"default": 1,
"description": "How many in their party.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"span": {
"default": 1,
"description": "How many back-to-back sessions from this one their visit takes, like a table for a meal.",
"type": "integer",
"minimum": 1,
"maximum": 48
},
"pay": {
"default": "door",
"description": "door: paid here; card: they get a pay link.",
"type": "string",
"enum": [
"door",
"card"
]
},
"over": {
"default": false,
"description": "Let them in even when it’s full: each session it’s short in grows by the seats missing.",
"type": "boolean"
},
"note": {
"default": "",
"type": "string",
"maxLength": 500
}
},
"additionalProperties": false
},
"requestId": {
"description": "A fresh random id you make for each new request. Send the same one again only to retry that exact request; a different request with it is refused.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.coverage
What can pay for a booking
- Kind
- Read
- Tool
booking_coverage- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A admission id: adm_ and 26 letters and digits."
},
"sessionIds": {
"default": [],
"description": "The sessions picked; leave out for a series.",
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
}
},
"customerId": {
"description": "The business only: who’s booking.",
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$"
},
"attendee": {
"default": "self",
"description": "Who goes: a membership pays only for its holder.",
"type": "string",
"enum": [
"self",
"guest",
"dependent"
]
},
"seats": {
"default": 1,
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"admissionId"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"grantId": {
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A grant id: grt_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "What it’s called: \"10-class pack\"."
},
"words": {
"type": "string",
"description": "What it does for this booking: \"Uses 1 visit. 5 left.\""
},
"kind": {
"type": "string"
},
"key": {
"type": "string",
"description": "Its benefit name, like gold; empty when none."
},
"productId": {
"anyOf": [
{
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"allowance": {
"type": "string",
"enum": [
"unlimited",
"per_period",
"balance"
]
},
"unit": {
"anyOf": [
{
"type": "string",
"enum": [
"visits",
"minutes",
"cents",
"uses"
]
},
{
"type": "null"
}
]
},
"cost": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "What this booking takes from it."
},
"left": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "What it has left now; null when unlimited."
},
"endsAt": {
"type": [
"string",
"null"
]
},
"ok": {
"type": "boolean"
},
"reason": {
"description": "Why it can’t pay for this, in the customer’s words.",
"type": "string"
},
"buyMore": {
"description": "Run low: the pack to buy again.",
"type": "object",
"properties": {
"productId": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
}
},
"required": [
"productId"
],
"additionalProperties": false
}
},
"required": [
"grantId",
"name",
"words",
"kind",
"key",
"productId",
"allowance",
"unit",
"cost",
"left",
"endsAt",
"ok"
],
"additionalProperties": false
}
},
"default": {
"anyOf": [
{
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A grant id: grt_ and 26 letters and digits."
},
{
"type": "null"
}
],
"description": "The grant used when none is picked: what costs them least."
},
"opens": {
"anyOf": [
{
"type": "object",
"properties": {
"publicAt": {
"type": "string"
},
"at": {
"type": "string"
}
},
"required": [
"publicAt",
"at"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "When everyone can book it, and when this customer can."
},
"membersOnly": {
"type": "boolean"
},
"member": {
"type": "boolean",
"description": "They hold a membership it’s for."
}
},
"required": [
"options",
"default",
"opens",
"membersOnly",
"member"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.coveredBookings
Bookings a membership pays for
- Kind
- Read
- Tool
booking_coveredBookings- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"grantId": {
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The membership or pack, by its grant. A grant id: grt_ and 26 letters and digits."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first day, the business’s date."
},
"until": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The day after the last."
}
},
"required": [
"grantId",
"from",
"until"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"bookings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"startsAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"when": {
"type": "string"
}
},
"required": [
"enrollmentId",
"name",
"startsAt",
"when"
],
"additionalProperties": false
}
}
},
"required": [
"bookings"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.customerVisits
See what a customer has coming up
- Kind
- Read
- Tool
booking_customerVisits- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"customerId": {
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A customer id: cus_ and 26 letters and digits."
}
},
"required": [
"customerId"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"visits": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"what": {
"type": "string"
},
"when": {
"type": "string"
},
"at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"href": {
"type": "string"
},
"due": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"id",
"what",
"when",
"at",
"href",
"due"
],
"additionalProperties": false
}
}
},
"required": [
"visits"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.days
Dates with open times
- Kind
- Read
- Tool
booking_days- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"admissionId": {
"description": "The option to book: a single-visit admission from offerings.get or offerings.bookable. Only times long enough for its length are open. May be left out only when the offering has one option, or with `minutes`.",
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$"
},
"minutes": {
"description": "A length to fit instead of the option’s: a booking being moved keeps the length it was booked with.",
"type": "integer",
"minimum": 5,
"maximum": 1440,
"multipleOf": 5
},
"addOns": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"description": "Add-ons the customer picked, as product ids from the offering’s add-ons, each once. A service add-on adds its minutes to the booking, so only times long enough for the whole length are open; each one is charged as its own line, even when a pack or membership pays for the option."
},
"parts": {
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The next service: an offering customers pick a time for. A offering id: off_ and 26 letters and digits."
},
"resourceId": {
"description": "Only this person for this part; anyone who runs it when left out.",
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$"
},
"admissionId": {
"description": "The option to book: a single-visit admission from offerings.get or offerings.bookable. Only times long enough for its length are open. May be left out only when the offering has one option, or with `minutes`.",
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$"
},
"minutes": {
"description": "A length to fit instead of the option’s: a booking being moved keeps the length it was booked with.",
"type": "integer",
"minimum": 5,
"maximum": 1440,
"multipleOf": 5
},
"addOns": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"description": "Add-ons the customer picked, as product ids from the offering’s add-ons, each once. A service add-on adds its minutes to the booking, so only times long enough for the whole length are open; each one is charged as its own line, even when a pack or membership pays for the option."
}
},
"required": [
"offeringId"
],
"additionalProperties": false
},
"description": "More services in the same visit, back to back in this order: each starts when the one before it ends, with no gap. Only starts where every part fits, with someone free for each and its rooms, are open. Each part takes its own option (`admissionId`, the same rule as the first), add-ons and person."
}
},
"required": [
"offeringId",
"from",
"to"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"open": {
"type": "array",
"items": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
}
},
"until": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
}
},
"required": [
"open",
"until"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.decline
Decline a booking request
- Kind
- Change
- Tool
booking_decline- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
}
},
"required": [
"enrollmentId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.editPattern
Change a repeating schedule from a date
- Kind
- Change
- Tool
booking_editPattern- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"patternId": {
"type": "string",
"pattern": "^pat_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The repeating schedule to change. A pattern id: pat_ and 26 letters and digits."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date the change applies to; sessions before it stay as they are."
},
"pattern": {
"oneOf": [
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "week"
},
"interval": {
"default": 1,
"description": "Every n weeks: 1 is weekly, 2 is every other week.",
"type": "integer",
"minimum": 1,
"maximum": 52
},
"days": {
"minItems": 1,
"maxItems": 7,
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"description": "Days of the week: 0 is Sunday, 1 Monday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"days",
"startMinute",
"from"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "month"
},
"interval": {
"default": 1,
"description": "Every n months.",
"type": "integer",
"minimum": 1,
"maximum": 12
},
"nth": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
},
{
"type": "number",
"const": -1
}
],
"description": "Which one in the month: 1 to 4, or -1 for the last."
},
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6,
"description": "The day: 0 is Sunday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"nth",
"weekday",
"startMinute",
"from"
],
"additionalProperties": false
}
],
"description": "The schedule from that date. Its `from` is set to the date above."
}
},
"required": [
"patternId",
"from",
"pattern"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.endStanding
End a standing booking
- Kind
- Change
- Tool
booking_endStanding- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"standingId": {
"type": "string",
"pattern": "^stb_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A standing id: stb_ and 26 letters and digits."
},
"refund": {
"default": "none",
"description": "The business only: none (the default, what’s been paid stays), policy, or all. Customers get none.",
"type": "string",
"enum": [
"policy",
"all",
"none"
]
}
},
"required": [
"standingId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.enroll
Book a place
- Kind
- Change
- Tool
booking_enroll- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The admission to buy, from offerings.get. A admission id: adm_ and 26 letters and digits."
},
"sessionIds": {
"default": [],
"description": "The session picked, for `one`; up to its count for `flex`. Leave out for a series (`all`, `set`): it covers every session to come.",
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
}
},
"customerId": {
"description": "Someone on your list, from customers_search.",
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "Their name, without a customerId.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
},
"attendees": {
"description": "Who goes: one place each, all in one checkout.",
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"default": "self",
"description": "self (the buyer goes), guest (named here) or dependent (a child or pet, by dependentId from customers_dependents).",
"type": "string",
"enum": [
"self",
"guest",
"dependent"
]
},
"dependentId": {
"description": "For a dependent: who, from customers.dependents.",
"type": "string",
"pattern": "^dep_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "For a guest: their name.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
},
"amountMinor": {
"description": "For pay what you want: the amount picked, in cents.",
"type": "integer",
"minimum": 0,
"maximum": 100000000
}
},
"additionalProperties": false
}
},
"more": {
"description": "More admissions in the same checkout, each with its own sessions and who goes: a second camp week, or a sibling in another class. One sale pays for all; each place keeps its own requirements and pass. Not with the waitlist.",
"maxItems": 9,
"type": "array",
"items": {
"type": "object",
"properties": {
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "Another admission to buy, from offerings.get. A admission id: adm_ and 26 letters and digits."
},
"sessionIds": {
"default": [],
"description": "The session picked, for `one`; up to its count for `flex`. Leave out for a series (`all`, `set`): it covers every session to come.",
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
}
},
"attendees": {
"description": "Who goes: one place each, all in one checkout.",
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"default": "self",
"description": "self (the buyer goes), guest (named here) or dependent (a child or pet, by dependentId from customers_dependents).",
"type": "string",
"enum": [
"self",
"guest",
"dependent"
]
},
"dependentId": {
"description": "For a dependent: who, from customers.dependents.",
"type": "string",
"pattern": "^dep_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "For a guest: their name.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
},
"amountMinor": {
"description": "For pay what you want: the amount picked, in cents.",
"type": "integer",
"minimum": 0,
"maximum": 100000000
}
},
"additionalProperties": false
}
}
},
"required": [
"admissionId"
],
"additionalProperties": false
}
},
"seats": {
"default": 1,
"description": "How many people each place is for (a party): one named attendee and the rest as their guests.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"span": {
"description": "Joining the waitlist for the next available time with no session picked: how many back-to-back sessions one visit takes. With sessions picked, it’s how many were picked.",
"type": "integer",
"minimum": 1,
"maximum": 48
},
"quotedWaitMinutes": {
"description": "The business only: the wait you quoted someone joining the waitlist.",
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"waitUntil": {
"description": "Joining the waitlist for the next available time: only offer a time that starts before this, like the end of tonight.",
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"note": {
"default": "",
"description": "Anything the business should know, like a birthday or a high chair.",
"type": "string",
"maxLength": 500
},
"over": {
"default": false,
"description": "The business only: book it even when it’s full. Each session it’s short in grows by the seats missing.",
"type": "boolean"
},
"pay": {
"default": "card",
"description": "card: paid online now (or from a pay link); door: paid in person at the session. For whatever a pack or membership doesn’t cover.",
"type": "string",
"enum": [
"card",
"door"
]
},
"grantId": {
"description": "The pack or membership that pays, from offerings.coverage. Left out, the one that costs them least is used when one covers it; none pays by card or at the door instead.",
"anyOf": [
{
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A grant id: grt_ and 26 letters and digits."
},
{
"type": "string",
"const": "none"
}
]
},
"codes": {
"default": [],
"description": "Codes they typed, like SPRING10.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"maxLength": 40
}
},
"tender": {
"default": [],
"description": "Gift cards (by `code`) and store credit they hold (by `grantId`) that pay first; a card or the door pays the rest. Not with a payment plan.",
"maxItems": 5,
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"required": [
"code"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"grantId": {
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A gift card or store credit they hold, from commerce.storedValue. A grant id: grt_ and 26 letters and digits."
}
},
"required": [
"grantId"
],
"additionalProperties": false
}
]
}
},
"taxZip": {
"label": "ZIP code",
"description": "Their ZIP code, to pay by card at a business that collects sales tax (`askZip` on offerings.review). Left out for someone who gave one here before.",
"type": "string",
"maxLength": 20
},
"waitlist": {
"default": false,
"description": "Join the waitlist when it’s full.",
"type": "boolean"
},
"textReminders": {
"default": false,
"description": "They ticked the consent to text reminders about this booking; needs their mobile (`phone`).",
"type": "boolean"
},
"landing": {
"description": "Where the visit that booked came from, for attribution.",
"type": "object",
"properties": {
"r": {
"default": "",
"type": "string",
"maxLength": 500
},
"q": {
"default": "",
"type": "string",
"maxLength": 500
}
},
"additionalProperties": false
},
"installments": {
"description": "Pay by card in a payment plan: `count` payments, the first now and the rest on `dates` (one per later payment) or `every` week or month. Needs `agreeToRenewal` with the `termsVersion` from commerce.previewSale.",
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 2,
"maximum": 12
},
"dates": {
"minItems": 1,
"maxItems": 11,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"every": {
"type": "string",
"enum": [
"week",
"month"
]
}
},
"required": [
"count"
],
"additionalProperties": false
},
"agreeToRenewal": {
"default": false,
"description": "The customer ticked the separate OK for the payment plan’s words (`words.renewal` from commerce.previewSale).",
"type": "boolean"
},
"termsVersion": {
"description": "The `termsVersion` the customer agreed to, with a plan.",
"type": "string",
"maxLength": 80
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "A fresh random id you make for each new request. Send the same one again only to retry that exact request; a different request with it is refused."
}
},
"required": [
"admissionId",
"requestId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.enrollment
Look up a booking
- Kind
- Read
- Tool
booking_enrollment- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
}
},
"required": [
"enrollmentId"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"customerId": {
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$",
"description": "Who booked. A customer id: cus_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
},
"paidWith": {
"type": "string",
"enum": [
"card",
"door",
"free",
"grant"
]
},
"attendee": {
"type": "string",
"enum": [
"self",
"guest",
"dependent"
]
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many in their party."
},
"agreementId": {
"anyOf": [
{
"type": "string",
"pattern": "^agr_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A agreement id: agr_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"offerExpiresAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "A waitlist spot held for them: pay by then to keep it."
},
"note": {
"type": "string",
"description": "What they or the business noted on it."
},
"manageUrl": {
"type": "string",
"description": "The booking’s own page on the business’s website, where they see, move or cancel it."
},
"sessions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"start": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"when": {
"type": "string"
},
"attendance": {
"type": "string",
"enum": [
"expected",
"attended",
"no_show",
"excused",
"called_off"
]
}
},
"required": [
"sessionId",
"start",
"when",
"attendance"
],
"additionalProperties": false
}
},
"visit": {
"anyOf": [
{
"type": "object",
"properties": {
"parts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "The service."
},
"sessionId": {
"anyOf": [
{
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"start": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
]
},
"when": {
"type": "string",
"description": "When it starts: \"Thu, Oct 8 at 10:45 AM\"."
},
"time": {
"type": "string",
"description": "Its start time: \"10:45 AM\"."
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How long it runs."
},
"staff": {
"description": "Who takes it.",
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
}
},
"required": [
"enrollmentId",
"offeringId",
"name",
"sessionId",
"start",
"when",
"time",
"minutes",
"staff",
"status"
],
"additionalProperties": false
},
"description": "Every part in the order it runs, cancelled ones included."
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How long the parts still on run, back to back."
},
"total": {
"type": "string",
"description": "The list price of the parts still on, each option with its add-ons, before discounts, packs and memberships: \"$100\"."
}
},
"required": [
"parts",
"minutes",
"total"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Part of a visit (several services back to back in one checkout): every part, or null when it’s a booking on its own."
}
},
"required": [
"enrollmentId",
"offeringId",
"customerId",
"name",
"status",
"paidWith",
"attendee",
"seats",
"agreementId",
"offerExpiresAt",
"note",
"manageUrl",
"sessions",
"visit"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.get
Look up an offering
- Kind
- Read
- Tool
booking_get- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
}
},
"required": [
"offeringId"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"offering": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"kind": {
"type": "string",
"enum": [
"class",
"course",
"workshop",
"event",
"camp",
"exhibition",
"appointment",
"rental",
"open_hours",
"day_care"
]
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"visibility": {
"type": "string",
"enum": [
"public",
"unlisted",
"private"
]
},
"capacity": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"locationId": {
"anyOf": [
{
"type": "string",
"pattern": "^loc_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A location id: loc_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"equipment": {
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"link": {
"type": "string",
"maxLength": 2000,
"format": "uri"
}
},
"required": [
"name"
],
"additionalProperties": false
},
"description": "What customers bring, each with an optional link."
},
"setupMinutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"cleanupMinutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"horizonDays": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How far ahead repeating sessions are added."
},
"slotMinutes": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Time slots: a session every this many minutes through the opening hours; null when it runs on a schedule or picked times."
},
"resources": {
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"anyOf": [
{
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"groupId": {
"anyOf": [
{
"type": "string",
"pattern": "^rgp_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource group id: rgp_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"name": {
"type": "string"
},
"admissionId": {
"anyOf": [
{
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A admission id: adm_ and 26 letters and digits."
},
{
"type": "null"
}
],
"description": "Only that option’s bookings, in place of the offering’s rooms; null for every session."
}
},
"required": [
"resourceId",
"groupId",
"name",
"admissionId"
],
"additionalProperties": false,
"description": "A room or equipment, or any free one of a group."
}
},
"staff": {
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"role": {
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
},
"patternId": {
"anyOf": [
{
"type": "string",
"pattern": "^pat_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A pattern id: pat_ and 26 letters and digits."
},
{
"type": "null"
}
],
"description": "Only that pattern’s sessions; null for all."
},
"admissionId": {
"anyOf": [
{
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A admission id: adm_ and 26 letters and digits."
},
{
"type": "null"
}
],
"description": "Only that option’s bookings, in place of the offering’s staff; null for all."
}
},
"required": [
"resourceId",
"name",
"role",
"patternId",
"admissionId"
],
"additionalProperties": false
}
},
"patterns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^pat_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A pattern id: pat_ and 26 letters and digits."
},
"pattern": {
"oneOf": [
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "week"
},
"interval": {
"default": 1,
"description": "Every n weeks: 1 is weekly, 2 is every other week.",
"type": "integer",
"minimum": 1,
"maximum": 52
},
"days": {
"minItems": 1,
"maxItems": 7,
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"description": "Days of the week: 0 is Sunday, 1 Monday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"interval",
"days",
"startMinute",
"from",
"skip",
"add"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "month"
},
"interval": {
"default": 1,
"description": "Every n months.",
"type": "integer",
"minimum": 1,
"maximum": 12
},
"nth": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
},
{
"type": "number",
"const": -1
}
],
"description": "Which one in the month: 1 to 4, or -1 for the last."
},
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6,
"description": "The day: 0 is Sunday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"interval",
"nth",
"weekday",
"startMinute",
"from",
"skip",
"add"
],
"additionalProperties": false
}
]
},
"locationId": {
"anyOf": [
{
"type": "string",
"pattern": "^loc_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A location id: loc_ and 26 letters and digits."
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"pattern",
"locationId"
],
"additionalProperties": false
}
},
"admissions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A admission id: adm_ and 26 letters and digits."
},
"productId": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"selector": {
"type": "string",
"enum": [
"one",
"all",
"set",
"flex"
],
"description": "one session they pick, all of them, a fixed set, or a number to pick later (flex)."
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"flexCount": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"reservedSeats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Seats in every session only series buyers can take."
},
"stock": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "How many can sell in all; null for no limit."
},
"seriesOnSale": {
"description": "A series: on sale only while every session still to come has room. null for a single-session or pick-later admission.",
"type": [
"boolean",
"null"
]
}
},
"required": [
"id",
"productId",
"selector",
"seats",
"flexCount",
"reservedSeats",
"stock",
"seriesOnSale"
],
"additionalProperties": false
}
},
"addOns": {
"type": "array",
"items": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"description": "Products customers can add to a booking, in the order shown: services add their minutes, items are handed over at the visit. Change them with offerings.save addOns."
}
},
"required": [
"id",
"kind",
"name",
"description",
"tags",
"status",
"visibility",
"capacity",
"locationId",
"equipment",
"setupMinutes",
"cleanupMinutes",
"horizonDays",
"slotMinutes",
"resources",
"staff",
"patterns",
"admissions",
"addOns"
],
"additionalProperties": false
}
},
"required": [
"offering"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.list
See your offerings
- Kind
- Read
- Tool
booking_list- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"status": {
"default": "active",
"description": "Active (the default) or archived.",
"type": "string",
"enum": [
"active",
"archived"
]
},
"kind": {
"type": "string",
"enum": [
"class",
"course",
"workshop",
"event",
"camp",
"exhibition",
"appointment",
"rental",
"open_hours",
"day_care"
]
}
},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"offerings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"kind": {
"type": "string",
"enum": [
"class",
"course",
"workshop",
"event",
"camp",
"exhibition",
"appointment",
"rental",
"open_hours",
"day_care"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"active",
"archived"
]
},
"visibility": {
"type": "string",
"enum": [
"public",
"unlisted",
"private"
]
},
"capacity": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Seats in each new session."
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"locationId": {
"anyOf": [
{
"type": "string",
"pattern": "^loc_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A location id: loc_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"next": {
"anyOf": [
{
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"start": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"when": {
"type": "string"
}
},
"required": [
"sessionId",
"start",
"when"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The next session, in its location’s time."
},
"upcoming": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Sessions still to come, not called off."
}
},
"required": [
"id",
"kind",
"name",
"status",
"visibility",
"capacity",
"tags",
"locationId",
"next",
"upcoming"
],
"additionalProperties": false
}
},
"hidden": {
"description": "How many records matched but belong to someone else, so this team member’s role doesn’t reach them. When they name one you can’t find, it’s likely one of these: say it isn’t one their role covers, never that it doesn’t exist.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"offerings"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.markAttendance
Mark attendance
- Kind
- Change
- Tool
booking_markAttendance- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"status": {
"type": "string",
"enum": [
"attended",
"no_show",
"excused",
"expected"
],
"description": "attended: they came; no_show: they didn’t (a card-paid place is charged its no-show fee); excused: they let you know; expected: undo a mark, back to not marked yet."
},
"count": {
"description": "With attended: how many of the party came. Left out, all of them.",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"sessionId",
"enrollmentId",
"status"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.note
Note on a booking
- Kind
- Change
- Tool
booking_note- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"note": {
"type": "string",
"maxLength": 500,
"description": "Empty clears it."
}
},
"required": [
"enrollmentId",
"note"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.onSale
Check whether anything is on sale to book
- Kind
- Read
- Tool
booking_onSale- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"any": {
"type": "boolean"
}
},
"required": [
"any"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.openSessions
Sessions you can book
- Kind
- Read
- Tool
booking_openSessions- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"seek": {
"default": false,
"description": "Look ahead from `date` to the first date with a session.",
"type": "boolean"
}
},
"required": [
"offeringId",
"date"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"date": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "The date these are on; null when nothing is coming up."
},
"day": {
"description": "That date with its weekday (\"Thursday, Oct 8, 2026\"), to say to the customer as is.",
"type": [
"string",
"null"
]
},
"timeZone": {
"type": "string"
},
"sessions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"start": {
"type": "number",
"description": "Epoch milliseconds."
},
"end": {
"type": "number",
"description": "Epoch milliseconds."
},
"label": {
"type": "string",
"description": "The time in its zone: \"6:00 PM\"."
},
"remaining": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Seats a single booking can still take; 0 is full."
}
},
"required": [
"id",
"start",
"end",
"label",
"remaining"
],
"additionalProperties": false
}
}
},
"required": [
"date",
"day",
"timeZone",
"sessions"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.places
See an offering’s bookings by day
- Kind
- Read
- Tool
booking_places- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first day, in the offering’s time."
},
"days": {
"default": 1,
"type": "integer",
"minimum": 1,
"maximum": 14
}
},
"required": [
"offeringId",
"from"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"timeZone": {
"type": "string"
},
"places": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"customerId": {
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A customer id: cus_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "Who booked."
},
"contact": {
"anyOf": [
{
"type": "object",
"properties": {
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"type": [
"string",
"null"
]
}
},
"required": [
"email",
"phone"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How to reach whoever booked, for someone who sees private details; null for everyone else."
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many in their party."
},
"span": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many back-to-back sessions the visit takes."
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
},
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The visit’s first session. A session id: ses_ and 26 letters and digits."
},
"start": {
"type": "number",
"description": "Epoch milliseconds."
},
"end": {
"type": "number",
"description": "When the visit’s last session ends, epoch ms."
},
"attendance": {
"anyOf": [
{
"type": "string",
"enum": [
"expected",
"attended",
"no_show",
"excused",
"called_off"
]
},
{
"type": "null"
}
],
"description": "How the first session went."
},
"checkedIn": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many of the party came."
},
"note": {
"type": "string"
}
},
"required": [
"enrollmentId",
"customerId",
"name",
"contact",
"seats",
"span",
"status",
"sessionId",
"start",
"end",
"attendance",
"checkedIn",
"note"
],
"additionalProperties": false
}
},
"waitlist": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"customerId": {
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A customer id: cus_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"contact": {
"anyOf": [
{
"type": "object",
"properties": {
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"type": [
"string",
"null"
]
}
},
"required": [
"email",
"phone"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How to reach whoever booked, for someone who sees private details; null for everyone else."
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"span": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
},
"sessionId": {
"anyOf": [
{
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
{
"type": "null"
}
],
"description": "The session they wait for; null for the next available time."
},
"quotedWaitMinutes": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"waitUntil": {
"description": "They wait only for a time before this, epoch ms.",
"type": [
"number",
"null"
]
},
"note": {
"type": "string"
},
"since": {
"type": "number",
"description": "When they joined, epoch ms."
}
},
"required": [
"enrollmentId",
"customerId",
"name",
"contact",
"seats",
"span",
"status",
"sessionId",
"quotedWaitMinutes",
"waitUntil",
"note",
"since"
],
"additionalProperties": false
},
"description": "In line for a session in these days or the next available time, first in line first."
}
},
"required": [
"timeZone",
"places",
"waitlist"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.preview
Preview an offering before saving
- Kind
- Read
- Tool
booking_preview- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"description": "The offering to change. Leave out to add one, or to find it by key.",
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$"
},
"key": {
"description": "Your own name for it, like pottery-fall. Saving with the same key again changes it instead of adding another.",
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,62}$"
},
"requestId": {
"description": "A fresh random id you make for each new request. Send the same one again only to retry that exact request; a different request with it is refused.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"shape": {
"description": "A starting point from offerings.shapes (class, course, workshop, appointment, rental, event, camp, retreat, open_hours, day_care, exhibition, tables): a new offering gets its kind and defaults.",
"type": "string",
"enum": [
"class",
"course",
"workshop",
"appointment",
"rental",
"event",
"camp",
"retreat",
"open_hours",
"day_care",
"exhibition",
"tables"
]
},
"kind": {
"description": "What it is. Taken from the shape when left out.",
"type": "string",
"enum": [
"class",
"course",
"workshop",
"event",
"camp",
"exhibition",
"appointment",
"rental",
"open_hours",
"day_care"
]
},
"name": {
"description": "Its name, as customers see it. A new offering needs one.",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"description": {
"type": "string",
"maxLength": 5000
},
"tags": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"locationId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Where it is: the location’s name, or its id from business_locations."
},
{
"type": "null"
}
]
},
"capacity": {
"description": "People in each session.",
"type": "integer",
"minimum": 0,
"maximum": 10000
},
"equipment": {
"description": "What customers bring, each with an optional link.",
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"link": {
"type": "string",
"maxLength": 2000,
"format": "uri"
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"setupMinutes": {
"description": "Minutes its rooms are held before each session.",
"type": "integer",
"minimum": 0,
"maximum": 480
},
"cleanupMinutes": {
"description": "Minutes its rooms are held after each session.",
"type": "integer",
"minimum": 0,
"maximum": 480
},
"horizonDays": {
"description": "How many days ahead repeating sessions appear.",
"type": "integer",
"minimum": 1,
"maximum": 1100
},
"visibility": {
"description": "public: on your website; unlisted: only by its link; private: only you book people in.",
"type": "string",
"enum": [
"public",
"unlisted",
"private"
]
},
"holdMinutes": {
"description": "How long a place booked through a customer’s AI assistant is held while they pay. Default 30.",
"anyOf": [
{
"type": "integer",
"minimum": 5,
"maximum": 1440
},
{
"type": "null"
}
]
},
"bookAheadDays": {
"description": "How many days ahead customers can book a session. Members with early booking get their extra days on top. Null: as soon as it’s on the schedule.",
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 365
},
{
"type": "null"
}
]
},
"onDemand": {
"description": "Customers pick their own time (an appointment, a lesson, a rental): its grid, notice, booking window, buffer and whether you OK each booking. Each single-visit admission sets its own length (durationMinutes). The staff listed are who customers can book. Null turns it off.",
"anyOf": [
{
"type": "object",
"properties": {
"stepMinutes": {
"default": 15,
"description": "Start times fall on this grid: every 15 minutes, say.",
"type": "integer",
"minimum": 5,
"maximum": 120,
"multipleOf": 5
},
"noticeMinutes": {
"default": 120,
"description": "How far ahead customers must book.",
"type": "integer",
"minimum": 0,
"maximum": 43200
},
"horizonDays": {
"default": 60,
"description": "How many days ahead customers can book.",
"type": "integer",
"minimum": 1,
"maximum": 365
},
"bufferMinutes": {
"default": 0,
"description": "Free time kept around each booking for the person running it.",
"type": "integer",
"minimum": 0,
"maximum": 120
},
"approval": {
"default": false,
"description": "Customer bookings wait for your OK before they’re confirmed.",
"type": "boolean"
},
"hours": {
"description": "Booking hours for this offering, Sunday (0) to Saturday (6), in minutes past midnight. Left out, the business’s hours apply.",
"type": "object",
"properties": {
"weekly": {
"minItems": 7,
"maxItems": 7,
"type": "array",
"items": {
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"start": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
},
"end": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
}
},
"required": [
"start",
"end"
],
"additionalProperties": false
}
}
},
"overrides": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"windows": {
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"start": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
},
"end": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
}
},
"required": [
"start",
"end"
],
"additionalProperties": false
}
}
},
"required": [
"date",
"windows"
],
"additionalProperties": false
}
}
},
"required": [
"weekly"
],
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"slotMinutes": {
"description": "Time slots: a session every this many minutes through your opening hours, like tables every 15 minutes. One booking can take several back-to-back slots. Null turns it off.",
"anyOf": [
{
"type": "integer",
"minimum": 5,
"maximum": 240,
"multipleOf": 5
},
{
"type": "null"
}
]
},
"resources": {
"description": "Rooms and equipment every session holds: by resourceId, groupId (any free one of a group) or name. Replaces the list.",
"maxItems": 10,
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
}
},
"required": [
"resourceId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"groupId": {
"type": "string",
"pattern": "^rgp_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource group id: rgp_ and 26 letters and digits."
}
},
"required": [
"groupId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"name"
],
"additionalProperties": false
}
]
}
},
"staff": {
"description": "Who runs it, in the order to try them, each with a role. Replaces the list.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
},
"patterns": {
"description": "Repeating schedules. New ones are added; ones already there stay as they are. To change one, use offerings.editPattern.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"pattern": {
"oneOf": [
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "week"
},
"interval": {
"default": 1,
"description": "Every n weeks: 1 is weekly, 2 is every other week.",
"type": "integer",
"minimum": 1,
"maximum": 52
},
"days": {
"minItems": 1,
"maxItems": 7,
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"description": "Days of the week: 0 is Sunday, 1 Monday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"days",
"startMinute",
"from"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "month"
},
"interval": {
"default": 1,
"description": "Every n months.",
"type": "integer",
"minimum": 1,
"maximum": 12
},
"nth": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
},
{
"type": "number",
"const": -1
}
],
"description": "Which one in the month: 1 to 4, or -1 for the last."
},
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6,
"description": "The day: 0 is Sunday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"nth",
"weekday",
"startMinute",
"from"
],
"additionalProperties": false
}
]
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Where it is: the location’s name, or its id from business_locations."
},
"staff": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
}
},
"required": [
"pattern"
],
"additionalProperties": false
}
},
"dates": {
"description": "One-off dates. New ones are added.",
"maxItems": 366,
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Start time: a 24-hour clock time like \"19:00\" (7 PM), or minutes past midnight (1140)."
},
"durationMinutes": {
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
]
}
},
"required": [
"date",
"minute"
],
"additionalProperties": false
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Where it is: the location’s name, or its id from business_locations."
},
"staff": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
}
},
"required": [
"date",
"startMinute"
],
"additionalProperties": false
}
},
"admissions": {
"description": "What it sells, each a product in your catalog. The whole list: ones left out come off sale.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"productId": {
"description": "A product already in your catalog to sell it as. Leave out to make one from name and price.",
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$"
},
"selector": {
"default": "one",
"description": "What it covers: one (a session they pick), all (the whole series), set (the dates listed) or flex (flexCount sessions picked later).",
"type": "string",
"enum": [
"one",
"all",
"set",
"flex"
]
},
"seats": {
"description": "Seats each sale takes, like 2 for a couple’s ticket. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"flexCount": {
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"reservedSeats": {
"description": "For a series: seats in every session only series buyers can take, so drop-ins can’t push it off sale.",
"type": "integer",
"minimum": 0,
"maximum": 10000
},
"stock": {
"description": "How many sell in all, like 100 tickets; null for no limit beyond the seats.",
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 100000
},
{
"type": "null"
}
]
},
"dates": {
"description": "For a set: the local dates (YYYY-MM-DD) of the sessions it covers.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"requires": {
"description": "Who can join, as keys: age:16+, age:6-9, form:<key> (a signed form), membership:<key>, file:<key> (a current file, like file:vaccination) or approval (you OK each person). They can name a form or membership you add later.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^(age:(\\d{1,2}\\+|\\d{1,2}-\\d{1,2})|(form|membership|file):[a-z0-9][a-z0-9_-]{0,62}|approval)$"
}
},
"benefits": {
"description": "Perks for members or pack holders, like { key: \"membership:gold\", percentOff: 15, earlyDays: 7 }. The membership can be added later.",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"pattern": "^(membership|pack):[a-z0-9][a-z0-9_-]{0,62}$",
"description": "Who gets it: membership:<key> or pack:<key>."
},
"percentOff": {
"description": "Their discount on this admission, in percent.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"earlyDays": {
"description": "How many days before everyone else they can book.",
"type": "integer",
"minimum": 1,
"maximum": 90
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"staff": {
"description": "For a single visit on an offering customers pick a time for: only these people take it, like a large-dog groom only Sam does. Left out or empty, everyone on the offering takes it. Who takes it never changes its length. Replaces its list; left out, it stays.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
},
"resources": {
"description": "For a single visit on an offering customers pick a time for: the rooms or equipment it holds instead of the offering’s, by resourceId, groupId or name, like the big tub for a large dog. Left out or empty, it holds the offering’s. Replaces its list; left out, it stays.",
"maxItems": 10,
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
}
},
"required": [
"resourceId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"groupId": {
"type": "string",
"pattern": "^rgp_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource group id: rgp_ and 26 letters and digits."
}
},
"required": [
"groupId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"name"
],
"additionalProperties": false
}
]
}
},
"name": {
"description": "What customers buy, like “Full course” or “Drop-in”. Saving again with the same name changes that admission.",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"priceMinor": {
"description": "Its price in cents. A new admission needs one, or payWhatYouWant. Use the price the owner gave. 0 means free: only when they said free. When they gave no price, don’t save yet: ask what to charge first.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"payWhatYouWant": {
"description": "Let customers pick what they pay (a sliding scale): at least minMinor, with suggestedMinor shown first and an optional maxMinor. Null goes back to one price.",
"anyOf": [
{
"type": "object",
"properties": {
"minMinor": {
"type": "integer",
"minimum": 0,
"maximum": 1000000,
"description": "The least they can pay, in cents; 0 for free."
},
"suggestedMinor": {
"description": "The amount shown first, in cents.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"maxMinor": {
"description": "The most they can pay, in cents.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"required": [
"minMinor"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"durationMinutes": {
"description": "For a single visit (one) on an offering customers pick a time for: how long it runs, in 5-minute steps up to 720. Each option has its own, like 60 and 90 minutes. A new one needs it; left out, an existing one keeps its length. Other admissions take their length from the schedule.",
"type": "integer",
"minimum": 5,
"maximum": 720,
"multipleOf": 5
}
},
"additionalProperties": false
}
},
"addOns": {
"description": "For an offering customers pick a time for: extras customers can add to a booking, in the order to show them. Each is a product from your catalog by name or id, or a new one with its name, price and the minutes it adds, made in the same save. A service with a length adds its minutes, like hot stones for 15 minutes; an item is handed over at the visit, like massage oil, and sells while it has stock. Each is charged as its own line, even when a pack pays for the booking. The whole list: ones left out stop being offered. Packs, memberships, bundles and gift cards can’t be add-ons.",
"maxItems": 10,
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The product's name, as the owner says it, or its id."
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"priceMinor": {
"description": "Its price in cents. A new add-on needs one.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"durationMinutes": {
"description": "For a service: the minutes it adds to the booking, like 15. Leave out for an item handed over at the visit.",
"type": "integer",
"minimum": 5,
"maximum": 1440,
"multipleOf": 5
}
},
"required": [
"name"
],
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"description": "True when it would save as it is."
},
"title": {
"type": "string"
},
"lines": {
"type": "array",
"items": {
"type": "string"
}
},
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string"
},
"from": {
"type": "string"
},
"to": {
"type": "string"
}
},
"required": [
"label"
],
"additionalProperties": false
}
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"message"
],
"additionalProperties": false
},
"description": "Every problem, each with the input it’s about."
}
},
"required": [
"ok",
"title",
"lines",
"changes",
"issues"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.reorder
Put your offerings in order
- Kind
- Change
- Tool
booking_reorder- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringIds": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"description": "Offerings in the order you want, from offerings.list. They swap into the places they held among the rest, so name only the ones you’re moving."
}
},
"required": [
"offeringIds"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.report
See how your offerings and teachers did
- Kind
- Read
- Tool
booking_report- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first day, YYYY-MM-DD."
},
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The last day, YYYY-MM-DD, included."
}
},
"required": [
"from",
"to"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"currency": {
"type": "string"
},
"totals": {
"type": "object",
"properties": {
"sessions": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Sessions that ran (ended, not called off)."
},
"calledOff": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Seats across the sessions that ran."
},
"booked": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "People booked into them."
},
"came": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"noShows": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"fillRate": {
"description": "Who came over the seats, 0 to 1.",
"type": [
"number",
"null"
]
},
"attendanceRate": {
"description": "Who came over who booked.",
"type": [
"number",
"null"
]
},
"noShowRate": {
"description": "No-shows over who booked.",
"type": [
"number",
"null"
]
},
"firstVisits": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "People whose first visit ever was here, in the range."
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Of them, those back within 30 days."
},
"retention": {
"description": "returned over firstVisits.",
"type": [
"number",
"null"
]
},
"revenueMinor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"revenue": {
"type": "string"
},
"provisional": {
"type": "boolean",
"description": "Includes membership visits whose month hasn’t ended."
}
},
"required": [
"sessions",
"calledOff",
"seats",
"booked",
"came",
"noShows",
"fillRate",
"attendanceRate",
"noShowRate",
"firstVisits",
"returned",
"retention",
"revenueMinor",
"revenue",
"provisional"
],
"additionalProperties": false
},
"offerings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"sessions": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Sessions that ran (ended, not called off)."
},
"calledOff": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Seats across the sessions that ran."
},
"booked": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "People booked into them."
},
"came": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"noShows": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"fillRate": {
"description": "Who came over the seats, 0 to 1.",
"type": [
"number",
"null"
]
},
"attendanceRate": {
"description": "Who came over who booked.",
"type": [
"number",
"null"
]
},
"noShowRate": {
"description": "No-shows over who booked.",
"type": [
"number",
"null"
]
},
"firstVisits": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "People whose first visit ever was here, in the range."
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Of them, those back within 30 days."
},
"retention": {
"description": "returned over firstVisits.",
"type": [
"number",
"null"
]
},
"revenueMinor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"revenue": {
"type": "string"
},
"provisional": {
"type": "boolean",
"description": "Includes membership visits whose month hasn’t ended."
}
},
"required": [
"id",
"name",
"sessions",
"calledOff",
"seats",
"booked",
"came",
"noShows",
"fillRate",
"attendanceRate",
"noShowRate",
"firstVisits",
"returned",
"retention",
"revenueMinor",
"revenue",
"provisional"
],
"additionalProperties": false
}
},
"teachers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The person’s resource id. A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"sessions": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Sessions that ran (ended, not called off)."
},
"calledOff": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Seats across the sessions that ran."
},
"booked": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "People booked into them."
},
"came": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"noShows": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"fillRate": {
"description": "Who came over the seats, 0 to 1.",
"type": [
"number",
"null"
]
},
"attendanceRate": {
"description": "Who came over who booked.",
"type": [
"number",
"null"
]
},
"noShowRate": {
"description": "No-shows over who booked.",
"type": [
"number",
"null"
]
},
"firstVisits": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "People whose first visit ever was here, in the range."
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Of them, those back within 30 days."
},
"retention": {
"description": "returned over firstVisits.",
"type": [
"number",
"null"
]
},
"revenueMinor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"revenue": {
"type": "string"
},
"provisional": {
"type": "boolean",
"description": "Includes membership visits whose month hasn’t ended."
}
},
"required": [
"id",
"name",
"sessions",
"calledOff",
"seats",
"booked",
"came",
"noShows",
"fillRate",
"attendanceRate",
"noShowRate",
"firstVisits",
"returned",
"retention",
"revenueMinor",
"revenue",
"provisional"
],
"additionalProperties": false
}
},
"months": {
"type": "array",
"items": {
"type": "object",
"properties": {
"month": {
"type": "string"
},
"label": {
"type": "string"
},
"firstVisits": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"retention": {
"type": [
"number",
"null"
]
},
"open": {
"type": "boolean",
"description": "Some first visits are under 30 days old, so this can still rise."
}
},
"required": [
"month",
"label",
"firstVisits",
"returned",
"retention",
"open"
],
"additionalProperties": false
}
},
"hidden": {
"description": "How many records matched but belong to someone else, so this team member’s role doesn’t reach them. When they name one you can’t find, it’s likely one of these: say it isn’t one their role covers, never that it doesn’t exist.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"from",
"to",
"currency",
"totals",
"offerings",
"teachers",
"months"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.reportExport
Download a report on your offerings
- Kind
- Read
- Tool
booking_reportExport- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first day, YYYY-MM-DD."
},
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The last day, YYYY-MM-DD, included."
},
"table": {
"type": "string",
"enum": [
"offerings",
"teachers",
"retention"
],
"description": "`offerings`, `teachers` or `retention` (by month)."
}
},
"required": [
"from",
"to",
"table"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"filename": {
"type": "string"
},
"csv": {
"type": "string"
},
"rows": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"filename",
"csv",
"rows"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.requirementLink
Get the link for a step a booking needs
- Kind
- Change
- Tool
booking_requirementLink- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"step": {
"type": "string",
"maxLength": 120,
"description": "The step, from `due` on offerings.booking (like form:waiver)."
}
},
"required": [
"enrollmentId",
"step"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.requirements
See what each admission asks for
- Kind
- Read
- Tool
booking_requirements- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"admissions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"offering": {
"type": "string"
},
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A admission id: adm_ and 26 letters and digits."
},
"productId": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "The admission, as it sells."
},
"requires": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"offeringId",
"offering",
"admissionId",
"productId",
"name",
"requires"
],
"additionalProperties": false
}
}
},
"required": [
"admissions"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.roster
See who’s coming to a session
- Kind
- Read
- Tool
booking_roster- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
}
},
"required": [
"sessionId"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"when": {
"type": "string",
"description": "When it starts, in its location’s time."
},
"capacity": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"taken": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"remaining": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"status": {
"type": "string",
"enum": [
"scheduled",
"called_off",
"released"
]
},
"note": {
"type": "string",
"description": "The line for the people booked, if any."
},
"staff": {
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"role": {
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId",
"name",
"role"
],
"additionalProperties": false
},
"description": "Who runs it, with a substitute shown as one."
},
"checkInCode": {
"type": "string",
"description": "The code customers type to check themselves in; show it at the location."
},
"people": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"attendanceId": {
"type": "string",
"pattern": "^att_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A attendance id: att_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "Who goes."
},
"customerId": {
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$",
"description": "Whose customer record their name opens: a guest’s own, else whoever booked. A customer id: cus_ and 26 letters and digits."
},
"buyer": {
"anyOf": [
{
"type": "string",
"description": "Who booked, when someone else goes in their place."
},
{
"type": "null"
}
]
},
"contact": {
"anyOf": [
{
"type": "object",
"properties": {
"email": {
"type": [
"string",
"null"
]
},
"phone": {
"type": [
"string",
"null"
]
}
},
"required": [
"email",
"phone"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How to reach whoever booked, for someone who sees private details (R37); null for everyone else."
},
"place": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many in their party."
},
"attendance": {
"type": "string",
"enum": [
"expected",
"attended",
"no_show",
"excused",
"called_off"
]
},
"checkedIn": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How many of the party came."
},
"paidWith": {
"type": "string",
"enum": [
"card",
"door",
"free",
"grant"
]
},
"series": {
"type": "boolean",
"description": "Booked for the whole series."
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "requirement_due or requirement_lapsed: check-in waits until it’s in."
},
"requirements": {
"type": "array",
"items": {
"type": "object",
"properties": {
"requirement": {
"type": "string",
"description": "What it needs: “Studio waiver”."
},
"status": {
"type": "string",
"enum": [
"met",
"missing",
"expired"
],
"description": "In, still to come, or ran out. Never the file or answers."
}
},
"required": [
"requirement",
"status"
],
"additionalProperties": false
},
"description": "Each form or record the booking needs, and whether it’s in. Never the answers or the file."
},
"option": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"minutes": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"name",
"minutes"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "A time booked on demand: the option they booked and the length it was booked with. Null for a session’s places."
},
"addOns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "What a service adds; 0 for an item."
}
},
"required": [
"name",
"minutes"
],
"additionalProperties": false
},
"description": "What they added to the booking, in the order picked."
},
"visit": {
"anyOf": [
{
"type": "object",
"properties": {
"parts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "The service."
},
"sessionId": {
"anyOf": [
{
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"start": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
]
},
"when": {
"type": "string",
"description": "When it starts: \"Thu, Oct 8 at 10:45 AM\"."
},
"time": {
"type": "string",
"description": "Its start time: \"10:45 AM\"."
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How long it runs."
},
"staff": {
"description": "Who takes it.",
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
}
},
"required": [
"enrollmentId",
"offeringId",
"name",
"sessionId",
"start",
"when",
"time",
"minutes",
"staff",
"status"
],
"additionalProperties": false
},
"description": "Every part in the order it runs, cancelled ones included."
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "How long the parts still on run, back to back."
},
"total": {
"type": "string",
"description": "The list price of the parts still on, each option with its add-ons, before discounts, packs and memberships: \"$100\"."
}
},
"required": [
"parts",
"minutes",
"total"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Part of a visit (several services back to back in one checkout): every part, or null when it’s a booking on its own."
}
},
"required": [
"enrollmentId",
"attendanceId",
"name",
"customerId",
"buyer",
"contact",
"place",
"seats",
"attendance",
"checkedIn",
"paidWith",
"series",
"flags",
"requirements",
"option",
"addOns",
"visit"
],
"additionalProperties": false
}
},
"waitlist": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"held",
"confirmed",
"waitlisted",
"offered",
"pending_approval",
"released",
"removed",
"cancelled"
]
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"series": {
"type": "boolean",
"description": "Waiting for the whole series or the next available time, not this session."
},
"quotedWaitMinutes": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"enrollmentId",
"name",
"status",
"seats",
"series",
"quotedWaitMinutes"
],
"additionalProperties": false
},
"description": "First in line first: this session’s line, then the series’."
}
},
"required": [
"sessionId",
"name",
"when",
"capacity",
"taken",
"remaining",
"status",
"note",
"staff",
"checkInCode",
"people",
"waitlist"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.save
Set up an offering
- Kind
- Change
- Tool
booking_save- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"description": "The offering to change. Leave out to add one, or to find it by key.",
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$"
},
"key": {
"description": "Your own name for it, like pottery-fall. Saving with the same key again changes it instead of adding another.",
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,62}$"
},
"requestId": {
"description": "A fresh random id you make for each new request. Send the same one again only to retry that exact request; a different request with it is refused.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"shape": {
"description": "A starting point from offerings.shapes (class, course, workshop, appointment, rental, event, camp, retreat, open_hours, day_care, exhibition, tables): a new offering gets its kind and defaults.",
"type": "string",
"enum": [
"class",
"course",
"workshop",
"appointment",
"rental",
"event",
"camp",
"retreat",
"open_hours",
"day_care",
"exhibition",
"tables"
]
},
"kind": {
"description": "What it is. Taken from the shape when left out.",
"type": "string",
"enum": [
"class",
"course",
"workshop",
"event",
"camp",
"exhibition",
"appointment",
"rental",
"open_hours",
"day_care"
]
},
"name": {
"description": "Its name, as customers see it. A new offering needs one.",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"description": {
"type": "string",
"maxLength": 5000
},
"tags": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"locationId": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Where it is: the location’s name, or its id from business_locations."
},
{
"type": "null"
}
]
},
"capacity": {
"description": "People in each session.",
"type": "integer",
"minimum": 0,
"maximum": 10000
},
"equipment": {
"description": "What customers bring, each with an optional link.",
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"link": {
"type": "string",
"maxLength": 2000,
"format": "uri"
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"setupMinutes": {
"description": "Minutes its rooms are held before each session.",
"type": "integer",
"minimum": 0,
"maximum": 480
},
"cleanupMinutes": {
"description": "Minutes its rooms are held after each session.",
"type": "integer",
"minimum": 0,
"maximum": 480
},
"horizonDays": {
"description": "How many days ahead repeating sessions appear.",
"type": "integer",
"minimum": 1,
"maximum": 1100
},
"visibility": {
"description": "public: on your website; unlisted: only by its link; private: only you book people in.",
"type": "string",
"enum": [
"public",
"unlisted",
"private"
]
},
"holdMinutes": {
"description": "How long a place booked through a customer’s AI assistant is held while they pay. Default 30.",
"anyOf": [
{
"type": "integer",
"minimum": 5,
"maximum": 1440
},
{
"type": "null"
}
]
},
"bookAheadDays": {
"description": "How many days ahead customers can book a session. Members with early booking get their extra days on top. Null: as soon as it’s on the schedule.",
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 365
},
{
"type": "null"
}
]
},
"onDemand": {
"description": "Customers pick their own time (an appointment, a lesson, a rental): its grid, notice, booking window, buffer and whether you OK each booking. Each single-visit admission sets its own length (durationMinutes). The staff listed are who customers can book. Null turns it off.",
"anyOf": [
{
"type": "object",
"properties": {
"stepMinutes": {
"default": 15,
"description": "Start times fall on this grid: every 15 minutes, say.",
"type": "integer",
"minimum": 5,
"maximum": 120,
"multipleOf": 5
},
"noticeMinutes": {
"default": 120,
"description": "How far ahead customers must book.",
"type": "integer",
"minimum": 0,
"maximum": 43200
},
"horizonDays": {
"default": 60,
"description": "How many days ahead customers can book.",
"type": "integer",
"minimum": 1,
"maximum": 365
},
"bufferMinutes": {
"default": 0,
"description": "Free time kept around each booking for the person running it.",
"type": "integer",
"minimum": 0,
"maximum": 120
},
"approval": {
"default": false,
"description": "Customer bookings wait for your OK before they’re confirmed.",
"type": "boolean"
},
"hours": {
"description": "Booking hours for this offering, Sunday (0) to Saturday (6), in minutes past midnight. Left out, the business’s hours apply.",
"type": "object",
"properties": {
"weekly": {
"minItems": 7,
"maxItems": 7,
"type": "array",
"items": {
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"start": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
},
"end": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
}
},
"required": [
"start",
"end"
],
"additionalProperties": false
}
}
},
"overrides": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"windows": {
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"start": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
},
"end": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"multipleOf": 5
}
},
"required": [
"start",
"end"
],
"additionalProperties": false
}
}
},
"required": [
"date",
"windows"
],
"additionalProperties": false
}
}
},
"required": [
"weekly"
],
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"slotMinutes": {
"description": "Time slots: a session every this many minutes through your opening hours, like tables every 15 minutes. One booking can take several back-to-back slots. Null turns it off.",
"anyOf": [
{
"type": "integer",
"minimum": 5,
"maximum": 240,
"multipleOf": 5
},
{
"type": "null"
}
]
},
"resources": {
"description": "Rooms and equipment every session holds: by resourceId, groupId (any free one of a group) or name. Replaces the list.",
"maxItems": 10,
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
}
},
"required": [
"resourceId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"groupId": {
"type": "string",
"pattern": "^rgp_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource group id: rgp_ and 26 letters and digits."
}
},
"required": [
"groupId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"name"
],
"additionalProperties": false
}
]
}
},
"staff": {
"description": "Who runs it, in the order to try them, each with a role. Replaces the list.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
},
"patterns": {
"description": "Repeating schedules. New ones are added; ones already there stay as they are. To change one, use offerings.editPattern.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"pattern": {
"oneOf": [
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "week"
},
"interval": {
"default": 1,
"description": "Every n weeks: 1 is weekly, 2 is every other week.",
"type": "integer",
"minimum": 1,
"maximum": 52
},
"days": {
"minItems": 1,
"maxItems": 7,
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 6
},
"description": "Days of the week: 0 is Sunday, 1 Monday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"days",
"startMinute",
"from"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"every": {
"type": "string",
"const": "month"
},
"interval": {
"default": 1,
"description": "Every n months.",
"type": "integer",
"minimum": 1,
"maximum": 12
},
"nth": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
},
{
"type": "number",
"const": 3
},
{
"type": "number",
"const": 4
},
{
"type": "number",
"const": -1
}
],
"description": "Which one in the month: 1 to 4, or -1 for the last."
},
"weekday": {
"type": "integer",
"minimum": 0,
"maximum": 6,
"description": "The day: 0 is Sunday … 6 Saturday."
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Local start time: a 24-hour clock time like \"19:00\" (7 PM) or \"09:30\", or minutes past midnight (19:00 is 1140)."
},
"durationMinutes": {
"description": "How long each session runs, in minutes. This or end.",
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"description": "For a session that ends on a later day, like an overnight.",
"type": "object",
"properties": {
"afterDays": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"description": "Days later."
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "The end time then, like \"10:00\"."
}
},
"required": [
"afterDays",
"minute"
],
"additionalProperties": false
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first date it can fall on, YYYY-MM-DD."
},
"until": {
"description": "The last date it can fall on. This, count, or neither.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"count": {
"description": "How many sessions this pattern makes in all, across all its days (not weeks). Tuesdays and Thursdays for 6 weeks is 12. Days with different rhythms are separate patterns: \"6 Tuesdays and alternate Thursdays\" is one weekly Tuesday pattern with count 6 and one Thursday pattern with interval 2 and count 3.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"default": [],
"description": "Dates it doesn’t run, like a holiday.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"add": {
"default": [],
"description": "Extra dates at the same time, like a make-up class.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
},
"required": [
"every",
"nth",
"weekday",
"startMinute",
"from"
],
"additionalProperties": false
}
]
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Where it is: the location’s name, or its id from business_locations."
},
"staff": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
}
},
"required": [
"pattern"
],
"additionalProperties": false
}
},
"dates": {
"description": "One-off dates. New ones are added.",
"maxItems": 366,
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"startMinute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
],
"description": "Start time: a 24-hour clock time like \"19:00\" (7 PM), or minutes past midnight (1140)."
},
"durationMinutes": {
"type": "integer",
"minimum": 1,
"maximum": 1440
},
"end": {
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"minute": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 1439
},
{
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$"
}
]
}
},
"required": [
"date",
"minute"
],
"additionalProperties": false
},
"locationId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Where it is: the location’s name, or its id from business_locations."
},
"staff": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
}
},
"required": [
"date",
"startMinute"
],
"additionalProperties": false
}
},
"admissions": {
"description": "What it sells, each a product in your catalog. The whole list: ones left out come off sale.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"productId": {
"description": "A product already in your catalog to sell it as. Leave out to make one from name and price.",
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$"
},
"selector": {
"default": "one",
"description": "What it covers: one (a session they pick), all (the whole series), set (the dates listed) or flex (flexCount sessions picked later).",
"type": "string",
"enum": [
"one",
"all",
"set",
"flex"
]
},
"seats": {
"description": "Seats each sale takes, like 2 for a couple’s ticket. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"flexCount": {
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"reservedSeats": {
"description": "For a series: seats in every session only series buyers can take, so drop-ins can’t push it off sale.",
"type": "integer",
"minimum": 0,
"maximum": 10000
},
"stock": {
"description": "How many sell in all, like 100 tickets; null for no limit beyond the seats.",
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 100000
},
{
"type": "null"
}
]
},
"dates": {
"description": "For a set: the local dates (YYYY-MM-DD) of the sessions it covers.",
"maxItems": 366,
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"requires": {
"description": "Who can join, as keys: age:16+, age:6-9, form:<key> (a signed form), membership:<key>, file:<key> (a current file, like file:vaccination) or approval (you OK each person). They can name a form or membership you add later.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^(age:(\\d{1,2}\\+|\\d{1,2}-\\d{1,2})|(form|membership|file):[a-z0-9][a-z0-9_-]{0,62}|approval)$"
}
},
"benefits": {
"description": "Perks for members or pack holders, like { key: \"membership:gold\", percentOff: 15, earlyDays: 7 }. The membership can be added later.",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"pattern": "^(membership|pack):[a-z0-9][a-z0-9_-]{0,62}$",
"description": "Who gets it: membership:<key> or pack:<key>."
},
"percentOff": {
"description": "Their discount on this admission, in percent.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"earlyDays": {
"description": "How many days before everyone else they can book.",
"type": "integer",
"minimum": 1,
"maximum": 90
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"staff": {
"description": "For a single visit on an offering customers pick a time for: only these people take it, like a large-dog groom only Sam does. Left out or empty, everyone on the offering takes it. Who takes it never changes its length. Replaces its list; left out, it stays.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Who: their name as the owner says it, or their resourceId from team_members."
},
"role": {
"default": "lead",
"description": "lead, substitute, assistant or host.",
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
},
"resources": {
"description": "For a single visit on an offering customers pick a time for: the rooms or equipment it holds instead of the offering’s, by resourceId, groupId or name, like the big tub for a large dog. Left out or empty, it holds the offering’s. Replaces its list; left out, it stays.",
"maxItems": 10,
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
}
},
"required": [
"resourceId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"groupId": {
"type": "string",
"pattern": "^rgp_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource group id: rgp_ and 26 letters and digits."
}
},
"required": [
"groupId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"name"
],
"additionalProperties": false
}
]
}
},
"name": {
"description": "What customers buy, like “Full course” or “Drop-in”. Saving again with the same name changes that admission.",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"priceMinor": {
"description": "Its price in cents. A new admission needs one, or payWhatYouWant. Use the price the owner gave. 0 means free: only when they said free. When they gave no price, don’t save yet: ask what to charge first.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"payWhatYouWant": {
"description": "Let customers pick what they pay (a sliding scale): at least minMinor, with suggestedMinor shown first and an optional maxMinor. Null goes back to one price.",
"anyOf": [
{
"type": "object",
"properties": {
"minMinor": {
"type": "integer",
"minimum": 0,
"maximum": 1000000,
"description": "The least they can pay, in cents; 0 for free."
},
"suggestedMinor": {
"description": "The amount shown first, in cents.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"maxMinor": {
"description": "The most they can pay, in cents.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"required": [
"minMinor"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"durationMinutes": {
"description": "For a single visit (one) on an offering customers pick a time for: how long it runs, in 5-minute steps up to 720. Each option has its own, like 60 and 90 minutes. A new one needs it; left out, an existing one keeps its length. Other admissions take their length from the schedule.",
"type": "integer",
"minimum": 5,
"maximum": 720,
"multipleOf": 5
}
},
"additionalProperties": false
}
},
"addOns": {
"description": "For an offering customers pick a time for: extras customers can add to a booking, in the order to show them. Each is a product from your catalog by name or id, or a new one with its name, price and the minutes it adds, made in the same save. A service with a length adds its minutes, like hot stones for 15 minutes; an item is handed over at the visit, like massage oil, and sells while it has stock. Each is charged as its own line, even when a pack pays for the booking. The whole list: ones left out stop being offered. Packs, memberships, bundles and gift cards can’t be add-ons.",
"maxItems": 10,
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The product's name, as the owner says it, or its id."
},
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"priceMinor": {
"description": "Its price in cents. A new add-on needs one.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"durationMinutes": {
"description": "For a service: the minutes it adds to the booking, like 15. Leave out for an item handed over at the visit.",
"type": "integer",
"minimum": 5,
"maximum": 1440,
"multipleOf": 5
}
},
"required": [
"name"
],
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.saveBookingPage
Choose the headings on your booking page
- Kind
- Change
- Tool
booking_saveBookingPage- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"groups": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"description": "Tags already on your offerings, in the order their headings show. Empty goes back to the default: each offering under its first tag, in the order of your offerings."
}
},
"required": [
"groups"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.sessionPay
See how a session’s places are paid
- Kind
- Read
- Tool
booking_sessionPay- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
}
},
"required": [
"sessionId"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"places": {
"type": "array",
"items": {
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"customerId": {
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A customer id: cus_ and 26 letters and digits."
},
"payer": {
"type": "string"
},
"paidWith": {
"type": "string",
"enum": [
"card",
"door",
"free",
"grant"
]
},
"agreementId": {
"anyOf": [
{
"type": "string",
"pattern": "^agr_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A agreement id: agr_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"grantId": {
"anyOf": [
{
"type": "string",
"pattern": "^grt_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A grant id: grt_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"bookedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"enrollmentId",
"customerId",
"payer",
"paidWith",
"agreementId",
"grantId",
"bookedAt"
],
"additionalProperties": false
}
},
"charges": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"chargeId": {
"type": "string",
"pattern": "^chg_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A charge id: chg_ and 26 letters and digits."
},
"agreementId": {
"type": "string",
"pattern": "^agr_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A agreement id: agr_ and 26 letters and digits."
},
"state": {
"type": "string",
"enum": [
"owed",
"paid",
"other"
]
},
"amount": {
"type": "string"
},
"amountMinor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"currency": {
"type": "string"
}
},
"required": [
"chargeId",
"agreementId",
"state",
"amount",
"amountMinor",
"currency"
],
"additionalProperties": false
}
},
{
"type": "null"
}
]
}
},
"required": [
"places",
"charges"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.sessions
See your sessions
- Kind
- Read
- Tool
booking_sessions- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"description": "One offering’s sessions; leave out for all of them.",
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$"
},
"from": {
"description": "The first day, in the business’s time. Leave out for now.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"days": {
"default": 14,
"type": "integer",
"minimum": 1,
"maximum": 120
},
"calledOff": {
"default": false,
"description": "Include sessions that were called off.",
"type": "boolean"
}
},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"sessions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"start": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"end": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"timeZone": {
"type": "string",
"description": "Its location’s zone."
},
"when": {
"type": "string",
"description": "When it starts, in its location’s time."
},
"locationId": {
"anyOf": [
{
"type": "string",
"pattern": "^loc_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A location id: loc_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"scheduled",
"called_off",
"released"
]
},
"pinned": {
"type": "boolean",
"description": "Keeps its exact time if the location’s time zone changes."
},
"note": {
"type": "string"
},
"capacity": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"taken": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"remaining": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"ended": {
"type": "boolean",
"description": "It’s over: it ended before now."
},
"staff": {
"type": "array",
"items": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"role": {
"type": "string",
"enum": [
"lead",
"substitute",
"assistant",
"host"
]
}
},
"required": [
"resourceId",
"name",
"role"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"offeringId",
"name",
"start",
"end",
"timeZone",
"when",
"locationId",
"status",
"pinned",
"note",
"capacity",
"taken",
"remaining",
"ended",
"staff"
],
"additionalProperties": false
}
},
"hidden": {
"description": "How many records matched but belong to someone else, so this team member’s role doesn’t reach them. When they name one you can’t find, it’s likely one of these: say it isn’t one their role covers, never that it doesn’t exist.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"sessions"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.sessionTotals
See how your sessions went
- Kind
- Read
- Tool
booking_sessionTotals- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The first day, YYYY-MM-DD."
},
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The last day, YYYY-MM-DD, included."
}
},
"required": [
"from",
"to"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"ran": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Sessions that ran (ended, not called off)."
},
"fillRate": {
"description": "Who came over the seats, 0 to 1.",
"type": [
"number",
"null"
]
},
"attendanceRate": {
"description": "Who came over who booked.",
"type": [
"number",
"null"
]
},
"retention": {
"description": "returned over firstVisits.",
"type": [
"number",
"null"
]
}
},
"required": [
"ran",
"fillRate",
"attendanceRate",
"retention"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.setCapacity
Change how many a session holds
- Kind
- Change
- Tool
booking_setCapacity- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
customers see it: waits for the owner’s approval unless they chose Just do it for your app
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"capacity": {
"type": "integer",
"minimum": 1,
"maximum": 10000
}
},
"required": [
"sessionId",
"capacity"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.shapes
See the kinds of offering you can set up
- Kind
- Read
- Tool
booking_shapes- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"shapes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"class",
"course",
"workshop",
"appointment",
"rental",
"event",
"camp",
"retreat",
"open_hours",
"day_care",
"exhibition",
"tables"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"class",
"course",
"workshop",
"event",
"camp",
"exhibition",
"appointment",
"rental",
"open_hours",
"day_care"
]
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
},
"defaults": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"example": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"id",
"title",
"description",
"kind",
"fields",
"defaults",
"example"
],
"additionalProperties": false
}
}
},
"required": [
"shapes"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.standing
See standing bookings
- Kind
- Read
- Tool
booking_standing- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"description": "One offering’s; leave out for all of them.",
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$"
},
"status": {
"default": "active",
"description": "active (the default) or ended.",
"type": "string",
"enum": [
"active",
"ended"
]
}
},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"standing": {
"type": "array",
"items": {
"type": "object",
"properties": {
"standingId": {
"type": "string",
"pattern": "^stb_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A standing id: stb_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"offering": {
"type": "string"
},
"customerId": {
"type": "string",
"pattern": "^cus_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A customer id: cus_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "Who goes."
},
"buyer": {
"description": "Who booked, when someone else goes in their place.",
"type": [
"string",
"null"
]
},
"when": {
"type": "string",
"description": "Its repeating time, like “Every Monday at 4:00 PM”."
},
"with": {
"description": "Who runs it.",
"type": [
"string",
"null"
]
},
"seats": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"paidWith": {
"type": "string",
"enum": [
"card",
"door",
"free",
"grant"
]
},
"status": {
"type": "string",
"enum": [
"active",
"ended"
]
}
},
"required": [
"standingId",
"offeringId",
"offering",
"customerId",
"name",
"buyer",
"when",
"with",
"seats",
"paidWith",
"status"
],
"additionalProperties": false
}
}
},
"required": [
"standing"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.summary
What’s going on
- Kind
- Read
- Tool
booking_summary- Scope
offerings:read- Reached by
- API, MCP
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"facts": {
"type": "array",
"items": {
"type": "string"
},
"description": "One-line facts, e.g. \"3 bookings today\"."
},
"attention": {
"description": "Things that need the owner, each with a plain reason.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
},
"href": {
"type": "string"
}
},
"required": [
"id",
"text"
],
"additionalProperties": false
}
},
"happening": {
"description": "What’s on today, each at its time.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"at": {
"type": "number",
"description": "Epoch milliseconds."
},
"text": {
"type": "string"
},
"href": {
"type": "string"
}
},
"required": [
"id",
"at",
"text"
],
"additionalProperties": false
}
},
"metrics": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"value": {
"type": "number"
},
"prior": {
"type": "number"
},
"unit": {
"type": "string",
"enum": [
"count",
"money"
]
},
"href": {
"type": "string"
}
},
"required": [
"id",
"label",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"title",
"facts"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.times
Open times on a date
- Kind
- Read
- Tool
booking_times- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "An offering customers pick a time for. A offering id: off_ and 26 letters and digits."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"seek": {
"default": false,
"description": "Look ahead from `date` to the first date with open times.",
"type": "boolean"
},
"resourceId": {
"description": "Only this person’s times; anyone who runs it when left out.",
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$"
},
"admissionId": {
"description": "The option to book: a single-visit admission from offerings.get or offerings.bookable. Only times long enough for its length are open. May be left out only when the offering has one option, or with `minutes`.",
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$"
},
"minutes": {
"description": "A length to fit instead of the option’s: a booking being moved keeps the length it was booked with.",
"type": "integer",
"minimum": 5,
"maximum": 1440,
"multipleOf": 5
},
"addOns": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"description": "Add-ons the customer picked, as product ids from the offering’s add-ons, each once. A service add-on adds its minutes to the booking, so only times long enough for the whole length are open; each one is charged as its own line, even when a pack or membership pays for the option."
},
"parts": {
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The next service: an offering customers pick a time for. A offering id: off_ and 26 letters and digits."
},
"resourceId": {
"description": "Only this person for this part; anyone who runs it when left out.",
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$"
},
"admissionId": {
"description": "The option to book: a single-visit admission from offerings.get or offerings.bookable. Only times long enough for its length are open. May be left out only when the offering has one option, or with `minutes`.",
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$"
},
"minutes": {
"description": "A length to fit instead of the option’s: a booking being moved keeps the length it was booked with.",
"type": "integer",
"minimum": 5,
"maximum": 1440,
"multipleOf": 5
},
"addOns": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A product id: prd_ and 26 letters and digits."
},
"description": "Add-ons the customer picked, as product ids from the offering’s add-ons, each once. A service add-on adds its minutes to the booking, so only times long enough for the whole length are open; each one is charged as its own line, even when a pack or membership pays for the option."
}
},
"required": [
"offeringId"
],
"additionalProperties": false
},
"description": "More services in the same visit, back to back in this order: each starts when the one before it ends, with no gap. Only starts where every part fits, with someone free for each and its rooms, are open. Each part takes its own option (`admissionId`, the same rule as the first), add-ons and person."
}
},
"required": [
"offeringId",
"date"
],
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"date": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "The date these times are on; null when nothing is open."
},
"day": {
"description": "That date with its weekday (\"Thursday, Oct 8, 2026\"), to say to the customer as is.",
"type": [
"string",
"null"
]
},
"timeZone": {
"type": "string"
},
"until": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "The last date that can be booked."
},
"times": {
"type": "array",
"items": {
"type": "object",
"properties": {
"start": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"description": "When it starts; pass it to offerings.book."
},
"label": {
"type": "string",
"description": "The time in the offering’s zone, like \"10:00 AM\"."
},
"staff": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"durationMinutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"id",
"name",
"durationMinutes"
],
"additionalProperties": false
},
"description": "Who is free then, in booking order. Empty for a room on its own."
},
"visit": {
"description": "With `parts`: every part of the visit in order, the first included, with when it starts and who takes it. The first person in `staff` takes part 1.",
"type": "array",
"items": {
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"admissionId": {
"anyOf": [
{
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A admission id: adm_ and 26 letters and digits."
},
{
"type": "null"
}
]
},
"start": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"label": {
"type": "string",
"description": "When this part starts, like \"10:45 AM\"."
},
"minutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"staff": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^res_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A resource id: res_ and 26 letters and digits."
},
"name": {
"type": "string"
}
},
"required": [
"id",
"name"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Who takes it; null for a room on its own."
}
},
"required": [
"offeringId",
"admissionId",
"start",
"label",
"minutes",
"staff"
],
"additionalProperties": false
}
}
},
"required": [
"start",
"label",
"staff"
],
"additionalProperties": false
}
}
},
"required": [
"date",
"day",
"timeZone",
"until",
"times"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}offerings.transfer
Move a booking
- Kind
- Change
- Tool
booking_transfer- Scope
offerings:write- Reached by
- API, MCP, ChatGPT
a private change: runs now if the owner lets your app make private changes, otherwise waits for their approval
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enrollmentId": {
"type": "string",
"pattern": "^bk_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A booking id: bk_ and 26 letters and digits."
},
"toSessionId": {
"description": "Another session of the same offering to move to.",
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$"
},
"toStart": {
"description": "A booked time of an offering customers pick a time for: the new start, from offerings.times. For a visit, the new start of its first part: every part moves with it, back to back, each keeping its length (pass the visit’s parts to offerings.times with each part’s `minutes`).",
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"attendee": {
"description": "Hand the place to someone else: the buyer, a guest or one of their dependents.",
"type": "object",
"properties": {
"kind": {
"default": "self",
"description": "self (the buyer goes), guest (named here) or dependent (a child or pet, by dependentId from customers_dependents).",
"type": "string",
"enum": [
"self",
"guest",
"dependent"
]
},
"dependentId": {
"description": "For a dependent: who, from customers.dependents.",
"type": "string",
"pattern": "^dep_[0-9a-hjkmnp-tv-z]{26}$"
},
"name": {
"default": "",
"description": "For a guest: their name.",
"type": "string",
"maxLength": 120
},
"email": {
"label": "Email",
"control": "email",
"description": "Their email, without a customerId.",
"type": "string",
"maxLength": 320
},
"phone": {
"label": "Phone",
"control": "tel",
"description": "Their mobile, without a customerId.",
"type": "string",
"maxLength": 40
}
},
"additionalProperties": false
},
"seats": {
"description": "A new party size, for a booking nothing was paid for (a free table), with or without toSessionId.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"over": {
"default": false,
"description": "The business only: move it even when it’s full.",
"type": "boolean"
}
},
"required": [
"enrollmentId"
],
"additionalProperties": false
}Output
{
"oneOf": [
{
"type": "object",
"required": [
"status",
"title",
"change"
],
"properties": {
"status": {
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {},
"undo": {
"type": "object",
"properties": {
"command": {
"type": "string"
},
"input": {}
}
}
}
},
{
"type": "object",
"required": [
"status",
"proposalId"
],
"properties": {
"status": {
"const": "proposed"
},
"proposalId": {
"type": "string"
},
"preview": {},
"approveAt": {
"type": "string",
"format": "uri"
}
}
},
{
"type": "object",
"required": [
"status",
"check"
],
"properties": {
"status": {
"const": "pending"
},
"message": {
"type": "string"
},
"check": {
"type": "string"
},
"checkInput": {
"type": "object"
}
}
},
{
"type": "object",
"required": [
"status",
"message"
],
"properties": {
"status": {
"const": "refused"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
}
},
{
"type": "object",
"required": [
"status",
"kind",
"message"
],
"properties": {
"status": {
"const": "needs"
},
"kind": {
"type": "string"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
}
}
]
}offerings.upcoming
Sessions coming up
- Kind
- Read
- Tool
booking_upcoming- Scope
offerings:read- Reached by
- API, MCP, ChatGPT
Read-only.
Input
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"days": {
"default": 7,
"type": "integer",
"minimum": 1,
"maximum": 31
},
"limit": {
"default": 60,
"description": "At most this many, soonest first.",
"type": "integer",
"minimum": 1,
"maximum": 60
}
},
"additionalProperties": false
}Output
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "done"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"result": {
"type": "object",
"properties": {
"timeZone": {
"type": "string"
},
"sessions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ses_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A session id: ses_ and 26 letters and digits."
},
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"start": {
"type": "number",
"description": "Epoch milliseconds."
},
"end": {
"type": "number",
"description": "Epoch milliseconds."
},
"when": {
"type": "string",
"description": "When it starts, with its weekday, in the business’s time zone: say this, never a weekday you worked out."
},
"remaining": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Seats a single booking can still take; 0 is full."
},
"price": {
"type": "string",
"description": "\"$25\", \"Free\", \"$120 for 5 sessions\" or \"$200 for the series\"."
},
"priceMinor": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "That price in cents; null when they pick what they pay."
},
"perSession": {
"type": "boolean",
"description": "The price is for one session, not a series or a pack."
},
"selector": {
"type": "string",
"enum": [
"one",
"all",
"set",
"flex"
],
"description": "What the price buys: one session (one), a number of sessions to pick (flex), a fixed set (set) or the whole series (all)."
},
"currency": {
"type": "string"
},
"membersOnly": {
"type": "boolean",
"description": "Only members can book it; say so."
},
"join": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"href": {
"type": "string"
}
},
"required": [
"name",
"href"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The membership on sale that lets someone book it, and its checkout on the site; null when none is on sale or it isn’t members-only."
}
},
"required": [
"id",
"offeringId",
"name",
"description",
"start",
"end",
"when",
"remaining",
"price",
"priceMinor",
"perSession",
"selector",
"currency",
"membersOnly",
"join"
],
"additionalProperties": false
}
},
"services": {
"type": "array",
"items": {
"type": "object",
"properties": {
"offeringId": {
"type": "string",
"pattern": "^off_[0-9a-hjkmnp-tv-z]{26}$",
"description": "A offering id: off_ and 26 letters and digits."
},
"admissionId": {
"type": "string",
"pattern": "^adm_[0-9a-hjkmnp-tv-z]{26}$",
"description": "The option: pass it as `admissionId` to offerings.times and offerings.book. A admission id: adm_ and 26 letters and digits."
},
"name": {
"type": "string",
"description": "The service’s name."
},
"option": {
"description": "The option’s own name when another option of the service has the same length; else null.",
"type": [
"string",
"null"
]
},
"description": {
"type": "string"
},
"durationMinutes": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"price": {
"type": "string",
"description": "\"$80\", \"Free\"."
}
},
"required": [
"offeringId",
"admissionId",
"name",
"option",
"description",
"durationMinutes",
"price"
],
"additionalProperties": false
},
"description": "What customers pick a time for (offerings.times): one entry per option, with its own length and price."
}
},
"required": [
"timeZone",
"sessions",
"services"
],
"additionalProperties": false
}
},
"required": [
"status",
"title",
"change",
"result"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "refused"
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"status",
"title",
"change",
"message"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "needs"
},
"kind": {
"type": "string",
"enum": [
"module",
"portal",
"business",
"limit",
"paused",
"reauth"
]
},
"title": {
"type": "string"
},
"change": {
"type": "boolean"
},
"message": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"status",
"kind",
"title",
"change",
"message"
],
"additionalProperties": {}
}
]
}