CDK Global Service Booking API
The Service Booking API from CDK Global — 6 operation(s) for service booking.
The Service Booking API from CDK Global — 6 operation(s) for service booking.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/cdk-global-service-booking-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
version: 45.0.0
title: Booking Sessions Service Booking API
description: "# Service Sessions - Service - Booking Sessions Spec\nThis spec describes an API implementation that allows a solution to book service sessions to a car dealership.\n\n# What does this API do?\nWith this spec, customers can use a solution to perform the following:\n\n* Create a booking session\n* Get the items in a booking session\n* Add items to the booking session\n* Remove items from a booking session\n* Query the service item by the identifier\n* Query the store\n* Query the store availability\n* Query the stores available session slots\n* Book the appointment \n\n# Intended Audience\nThis spec gives API Providers the design for APIs that allow dealers to book sessions online at different stores.\nThis spec can give a design for a small API implementation or a large chain of dealerships that share a solution for booking service sessions. \n"
contact:
name: Developer Evangelists
url: https://fortellis.io/contact-us
email: support@fortellis.io
servers:
- url: https://api.fortellis.io/service/sessions/v4/
security:
- permission-model:
- anonymous
tags:
- name: Service Booking
paths:
/booking-sessions:
post:
summary: Create a bookingSession
tags:
- Service Booking
description: Creates a Booking Session. This session encapsulates the process of establishing the vehicle to be serviced, what services will be performed, what customer transportation is requested, and which available appointment slots are available.
operationId: createBookingSession
responses:
'201':
$ref: '#/components/responses/Created'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/header.Content-Type'
- $ref: '#/components/parameters/body.CreateBookingSessionPayload'
/booking-sessions/{bookingSessionId}/items:
post:
summary: Adds a requested service item to the Booking Session
tags:
- Service Booking
description: Adds a requested service item to the Booking Session
operationId: addBookingSessionItem
responses:
'201':
$ref: '#/components/responses/Created'
'400':
$ref: '#/components/responses/BadRequest'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/header.Content-Type'
- $ref: '#/components/parameters/path.bookingSessionId'
- $ref: '#/components/parameters/body.AddItemPayload'
get:
summary: Queries the service items of the Booking Session
tags:
- Service Booking
description: Queries the requested service items of the Booking Session
operationId: queryBookingSessionItems
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/path.bookingSessionId'
responses:
'200':
$ref: '#/components/responses/items'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'410':
$ref: '#/components/responses/Gone'
/booking-sessions/{bookingSessionId}/items/{itemId}:
post:
summary: Updates a requested service item to the Booking Session
tags:
- Service Booking
description: Updates a requested service item to the Booking Session
operationId: updateBookingSessionItem
responses:
'200':
$ref: '#/components/responses/OK'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/header.Content-Type'
- $ref: '#/components/parameters/path.bookingSessionId'
- $ref: '#/components/parameters/path.itemId'
- $ref: '#/components/parameters/body.UpdateItemPayload'
get:
summary: Queries a requested service item by identifier
tags:
- Service Booking
description: Queries a requested service item by identifier
operationId: queryRequestedServiceItemById
responses:
'200':
$ref: '#/components/responses/items'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'410':
$ref: '#/components/responses/Gone'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/path.bookingSessionId'
- $ref: '#/components/parameters/path.itemId'
delete:
summary: Removes a service item from the Booking Session
tags:
- Service Booking
description: Removes a service item from the Booking Session
operationId: removeBookingSessionItem
responses:
'200':
$ref: '#/components/responses/OK'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/header.Content-Type'
- $ref: '#/components/parameters/path.bookingSessionId'
- $ref: '#/components/parameters/path.itemId'
/booking-sessions/{bookingSessionId}/available-stores:
get:
summary: Queries the store availability for appointments for booking
tags:
- Service Booking
description: Queries the store availability for appointments for booking
operationId: queryBookingSessionStoreAvailability
responses:
'200':
$ref: '#/components/responses/AvailableStore'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'410':
$ref: '#/components/responses/Gone'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/path.bookingSessionId'
/booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots:
get:
summary: Queries the available appointment slots by store
tags:
- Service Booking
description: Queries the available appointment slots by store
operationId: queryBookingSessionsAvailableStoreSlots
responses:
'200':
$ref: '#/components/responses/Slot'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'410':
$ref: '#/components/responses/Gone'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/path.bookingSessionId'
- $ref: '#/components/parameters/path.storeId'
/booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots/{slotId}:
get:
summary: Queries an available appointment slot
tags:
- Service Booking
description: Queries an available appointment slot
operationId: queryBookingSessionsAvailableSlot
responses:
'200':
$ref: '#/components/responses/Slot'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'410':
$ref: '#/components/responses/Gone'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/path.bookingSessionId'
- $ref: '#/components/parameters/path.storeId'
- $ref: '#/components/parameters/path.slotId'
post:
summary: Books an appointment slot. This is the final step in the appointment booking process.
tags:
- Service Booking
description: Books an appointment slot. This is the final step in the appointment booking process.
operationId: bookAppointmentSlot
responses:
'201':
$ref: '#/components/responses/Created'
'400':
$ref: '#/components/responses/BadRequest'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'410':
$ref: '#/components/responses/Gone'
parameters:
- $ref: '#/components/parameters/header.Request-Id'
- $ref: '#/components/parameters/header.Subscription-Id'
- $ref: '#/components/parameters/header.Authorization'
- $ref: '#/components/parameters/header.Content-Type'
- $ref: '#/components/parameters/path.bookingSessionId'
- $ref: '#/components/parameters/path.storeId'
- $ref: '#/components/parameters/path.slotId'
components:
schemas:
Slot:
description: This field indicates the time slot that the store selects a time slot to offer the transportation.
required:
- slotId
- storeId
- dateTime
- transportationOffer
- links
properties:
slotId:
type: string
format: uuid
description: The identifier of the slot
storeId:
type: string
format: uuid
description: The identifier of the store
dateTime:
type: string
format: date-time
description: The date and time of the slot
transportationOffer:
$ref: '#/components/schemas/TransportationOffer'
links:
$ref: '#/components/schemas/LinksObject'
example:
slotId: 85254b70-c4b0-4461-937f-34d3502796bd
dateTime: '2019-10-11T09:30:00+00:00'
storeId: 85254b70-c4b0-4461-937f-34d3502796bd
transportationOffer:
transportationOfferId: fd133724-3450-47c3-b4a4-f888dbf74e40
description: Midsized loaner car
cost:
baseCost: 0.0
currencyType: GBP
links:
bookingSessions:
functions: Create a booking session.
href: /booking-sessions
methods:
GET: false
POST: true
DELETE: false
bookingSessionItems:
functions: Create and query session items.
href: /booking-sessions/{bookingSessionId}/items
methods:
GET: true
POST: true
DELETE: false
bookingSessionItem:
functions: Create and delete session items.
href: /booking-sessions/{bookingSessionId}/items/{itemId}
methods:
GET: false
POST: true
DELETE: true
bookingSessionAvailableStores:
functions: Query the available stores.
href: /booking-sessions/{bookingSessionId}/available-stores
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlots:
functions: Query slots that an available store has.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlot:
functions: Book and query a slot.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots/{slotId}
methods:
GET: true
POST: true
DELETE: false
Cost:
description: This is the description of the cost.
required:
- baseCost
- currencyType
properties:
baseCost:
type: number
description: The base cost
currencyType:
type: string
description: The currency type of the cost
example:
baseCost: 53.42
currencyType: US
LinksObject:
description: This is the common links object across all API calls.
type: object
properties:
bookingSessions:
type: object
properties:
functions:
type: string
href:
type: string
methods:
type: object
properties:
POST:
type: boolean
GET:
type: boolean
DELETE:
type: boolean
bookingSessionItems:
type: object
properties:
functions:
type: string
href:
type: string
methods:
type: object
properties:
POST:
type: boolean
GET:
type: boolean
DELETE:
type: boolean
bookingSessionItem:
type: object
properties:
functions:
type: string
href:
type: string
methods:
type: object
properties:
POST:
type: boolean
GET:
type: boolean
DELETE:
type: boolean
bookingSessionAvailableStores:
type: object
properties:
functions:
type: string
href:
type: string
methods:
type: object
properties:
POST:
type: boolean
GET:
type: boolean
DELETE:
type: boolean
bookingSessionAvailableStoreSlots:
type: object
properties:
functions:
type: string
href:
type: string
methods:
type: object
properties:
POST:
type: boolean
GET:
type: boolean
DELETE:
type: boolean
bookingSessionAvailableStoreSlot:
type: object
properties:
functions:
type: string
href:
type: string
methods:
type: object
properties:
POST:
type: boolean
GET:
type: boolean
DELETE:
type: boolean
required:
- bookingSessions
- bookingSessionItems
- bookingSessionItem
- bookingSessionAvailableStores
- bookingSessionAvailableStoreSlots
- bookingSessionAvailableStoreSlot
example:
bookingSessions:
functions: Create a booking session.
href: /booking-sessions
methods:
GET: false
POST: true
DELETE: false
bookingSessionItems:
functions: Create and query session items.
href: /booking-sessions/{bookingSessionId}/items
methods:
GET: true
POST: true
DELETE: false
bookingSessionItem:
functions: Create and delete session items.
href: /booking-sessions/{bookingSessionId}/items/{itemId}
methods:
GET: false
POST: true
DELETE: true
bookingSessionAvailableStores:
functions: Query the available stores.
href: /booking-sessions/{bookingSessionId}/available-stores
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlots:
functions: Query slots that an available store has.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlot:
functions: Book and query a slot.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots/{slotId}
methods:
GET: true
POST: true
DELETE: false
Ok:
description: This describes a successful POST to update an item.
required:
- success
- links
properties:
success:
type: string
links:
$ref: '#/components/schemas/LinksObject'
example:
success: OK
links:
bookingSessions:
functions: Create a booking session.
href: /booking-sessions
methods:
GET: false
POST: true
DELETE: false
bookingSessionItems:
functions: Create and query session items.
href: /booking-sessions/{bookingSessionId}/items
methods:
GET: true
POST: true
DELETE: false
bookingSessionItem:
functions: Create and delete session items.
href: /booking-sessions/{bookingSessionId}/items/{itemId}
methods:
GET: false
POST: true
DELETE: true
bookingSessionAvailableStores:
functions: Query the available stores.
href: /booking-sessions/{bookingSessionId}/available-stores
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlots:
functions: Query slots that an available store has.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlot:
functions: Book and query a slot.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots/{slotId}
methods:
GET: true
POST: true
DELETE: false
Error:
description: This is the description of the error that you are getting.
required:
- code
- message
properties:
code:
type: integer
format: int32
message:
type: string
example:
code: 400
message: Bad Request
CreateBookingSessionPayload:
description: This is the booking session payload.
required:
- storeIdList
- searchWindowStart
- searchWindowEnd
- links
properties:
vehicleSpecId:
type: string
description: The vehicle service model identifier
vehicleTypeId:
type: string
format: uuid
description: The identifier of the vehicle type
customerId:
type: string
format: uuid
description: The identifier of the customer
storeIdList:
type: array
items:
type: string
format: uuid
description: The identifiers of the stores to search
searchWindowStart:
type: string
format: date-time
description: The the start of the search window
searchWindowEnd:
type: string
format: date-time
description: The the end of the search window
requestedTransportation:
type: string
enum:
- WAITER
- LOANER
- RENTAL
- VALET_PICKUP
- SHUTTLE
description: The requested customer transportation
example:
- appointmentId: 79667722-fcc4-4cd8-995b-75d566bbba1b
storeId: 85254b70-c4b0-4461-937f-34d3502796bd
vehicleSpecId: CHEV-CORVST-2017-US
customerId: e3ad5443-72a7-4423-af2c-a5d7d510a39e
advisorId: 282fc845-868d-4678-b06c-82a6794e6309
accommodation:
accommodationId: fd133724-3450-47c3-b4a4-f888dbf74e40
accommodationRef: xchange.com/loaner-car/api/accommodation/v1
description: A courtesy loaner car has been reserved for Ms. Jones
dateTime: '2019-10-11T09:32:04+00:00'
status: BOOKED
AddItemPayload:
description: This describes the item that was added to the payload.
required:
- text
- comment
- id
- specificationId
properties:
text:
type: string
description: A text field.
comment:
type: string
description: A comment field.
id:
type: string
description: The service package Id. Unique when coupled with vehicleSpecId
specificationId:
type: string
description: The specific instance of the service package.
example:
text: Windshield Wiper Motor - Replace
id: BY28
comment: Customer requested service.
specificationId: '21732242'
TransportationOption:
description: This indicates the option of transportation that the customer selected.
required:
- transportationOptionId
- description
properties:
transportationOptionId:
type: string
format: uuid
description: The identifier of the transportation option
description:
type: string
example:
transportationOptionId: 779913c9-bb93-46f0-8860-9c893128c62c
description: Some description
Item:
description: This give the service package that the store would like to offer to the consumer.
required:
- itemId
- text
- comment
- id
- specificationId
- links
properties:
itemId:
type: string
description: The unique identifier of the item
text:
type: string
description: A text field.
comment:
type: string
description: A comment field.
id:
type: string
description: The service package Id. Unique when coupled with vehicleSpecId
specificationId:
type: string
description: The specific instance of the service package.
links:
$ref: '#/components/schemas/LinksObject'
example:
itemId: f74d81c1-fe33-4f1a-a5f6-ace24da670a8
text: 30,000 mile service - 2014 Toyota Camry
id: BY28
comment: Customer requested service.
specificationId: '21732242'
links:
bookingSessions:
functions: Create a booking session.
href: /booking-sessions
methods:
GET: false
POST: true
DELETE: false
bookingSessionItems:
functions: Create and query session items.
href: /booking-sessions/{bookingSessionId}/items
methods:
GET: true
POST: true
DELETE: false
bookingSessionItem:
functions: Create and delete session items.
href: /booking-sessions/{bookingSessionId}/items/{itemId}
methods:
GET: false
POST: true
DELETE: true
bookingSessionAvailableStores:
functions: Query the available stores.
href: /booking-sessions/{bookingSessionId}/available-stores
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlots:
functions: Query slots that an available store has.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlot:
functions: Book and query a slot.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots/{slotId}
methods:
GET: true
POST: true
DELETE: false
TransportationOffer:
description: This is the offer to provide transportation.
required:
- transportationOfferId
- description
- cost
properties:
transportationOfferId:
type: string
format: uuid
description: The identifier of the transportation offer
description:
type: string
description: The description transportation offer
cost:
$ref: '#/components/schemas/Cost'
example:
transportationOfferId: fd133724-3450-47c3-b4a4-f888dbf74e40
description: Midsized loaner car
cost:
baseCost: 0.0
currencyType: GBP
BookingSession:
description: This confirms the booking session when you have booked something.
required:
- bookingSessionId
- storeIdList
- vehicleSpecId
- vehicleTypeId
- customerId
- searchWindowStart
- searchWindowEnd
- transportationOptions
- selectedTransportationOptions
- links
properties:
bookingSessionId:
type: string
description: The identifier of the booking session
storeIdList:
type: array
items:
type: string
description: The identifiers of the stores to search
vehicleSpecId:
type: string
description: The vehicle service model identifier
vehicleTypeId:
type: string
description: The identifier of the vehicle type
customerId:
type: string
description: The unique identifier of the customer
searchWindowStart:
type: string
format: date-time
description: The the start of the search window
searchWindowEnd:
type: string
format: date-time
description: The the end of the search window
transportationOptions:
type: array
items:
$ref: '#/components/schemas/TransportationOption'
description: The available transportation options given the current filters
selectedTransportationOptions:
type: array
items:
type: string
description: The identifiers of the selected available transportation options
links:
$ref: '#/components/schemas/LinksObject'
example:
bookingSessionId: 0fe1767a-0556-4661-9991-19dcfbb74421
storeIdList:
- 29e1d17e-1ccf-4992-8ee0-e28dd75a3f75
vehicleSpecId: CHEV-CORVST-2017-US
vehicleTypeId: d062d8d8-d2b4-4c28-8060-a2f6ed9c9257
customerId: 73589670-4891-4204-aa61-1ffe7ceea50e
searchWindowStart: '2018-02-20T08:00:00Z'
searchWindowEnd: '2018-02-21T16:00:00Z'
transportationOptions:
- transportationOptionId: 45e41b0d-099e-46d6-9ebd-ea35a2cd9f19
description: Customer waiting
selectedTransportationOptions:
- WAITER
links:
bookingSessions:
functions: Create a booking session.
href: /booking-sessions
methods:
GET: false
POST: true
DELETE: false
bookingSessionItems:
functions: Create and query session items.
href: /booking-sessions/{bookingSessionId}/items
methods:
GET: true
POST: true
DELETE: false
bookingSessionItem:
functions: Create and delete session items.
href: /booking-sessions/{bookingSessionId}/items/{itemId}
methods:
GET: false
POST: true
DELETE: true
bookingSessionAvailableStores:
functions: Query the available stores.
href: /booking-sessions/{bookingSessionId}/available-stores
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlots:
functions: Query slots that an available store has.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlot:
functions: Book and query a slot.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots/{slotId}
methods:
GET: true
POST: true
DELETE: false
AvailableStore:
description: This shows when the store has available slots.
required:
- storeId
- slots
- links
properties:
storeId:
type: string
format: uuid
description: The identifier of the store
slots:
type: array
items:
$ref: '#/components/schemas/Slot'
description: The available appointment slots
links:
$ref: '#/components/schemas/LinksObject'
example:
storeId: 01b1a2a6-257d-4b35-b4c2-ae08153033ca
slots:
- time
- time
- time
links:
bookingSessions:
functions: Create a booking session.
href: /booking-sessions
methods:
GET: false
POST: true
DELETE: false
bookingSessionItems:
functions: Create and query session items.
href: /booking-sessions/{bookingSessionId}/items
methods:
GET: true
POST: true
DELETE: false
bookingSessionItem:
functions: Create and delete session items.
href: /booking-sessions/{bookingSessionId}/items/{itemId}
methods:
GET: false
POST: true
DELETE: true
bookingSessionAvailableStores:
functions: Query the available stores.
href: /booking-sessions/{bookingSessionId}/available-stores
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlots:
functions: Query slots that an available store has.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots
methods:
GET: true
POST: false
DELETE: false
bookingSessionAvailableStoreSlot:
functions: Book and query a slot.
href: /booking-sessions/{bookingSessionId}/available-stores/{storeId}/slots/{slotId}
methods:
GET: true
POST: true
DELETE: false
parameters:
body.UpdateItemPayload:
name: UpdateItemPayload
in: body
description: The item update parameters
schema:
$ref: '#/components/schemas/AddItemPayload'
path.bookingSessionId:
name: bookingSessionId
in: path
description: The identifie
# --- truncated at 32 KB (36 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/cdk-global/refs/heads/main/openapi/cdk-global-service-booking-api-openapi.yml