Amazon Developer

as

Settings
Sign out
Notifications
Alexa
Amazon Appstore
Ring
AWS
Documentation
Support
Contact Us
My Cases
Category SDK
MCP toolkit
Certify
Resources
Skip to main content
This document outlines the Service Provider Interface (SPI) for Local Booking within the Category SDK framework. The SPI defines the contract you implement to integrate local service booking with Alexa+. Supported businesses include salons, spas, fitness centers, and other appointment-based services.

Namespace

The namespace for the Local Booking SPI is com.amazon.alexa.localbooking.v1.

Interaction pattern

The Local Booking SPI lets Alexa+ customers search for a local business, browse its service catalog, and manage appointments by voice. The flow begins after the customer selects a business through a local search. Alexa+ then calls your SPI with the resolved businessId to complete the booking task. A typical booking flow:
  1. Alexa+ calls GetServices to match the requested service against your catalog.
  2. Alexa+ calls GetAvailability to find open time slots for the selected service.
  3. Alexa+ calls GetBusiness to retrieve the cancellation policy for the business before confirmation.
  4. After the customer confirms, Alexa+ calls CreateAppointment to book the appointment.
Post-booking flows for reschedule, cancel, rebook, and status check resolve the target appointment from the Alexa appointment datastore. Alexa+ then calls the relevant SPI operation.

Operations

The Local Booking SPI supports the following operations. Alexa+ performs permission checks at runtime before running each SPI operation.
OperationPathHTTP methodTypeRequires permissions
CancelAppointment/v1/localbooking/businesses/{businessId}/appointments/{appointmentId}DELETEIdempotent—
CreateAppointment/v1/localbooking/businesses/{businessId}/appointmentsPOSTNon-idempotentREAD_MOBILE_NUMBER, READ_EMAIL, READ_FULL_NAME
GetAppointment/v1/localbooking/businesses/{businessId}/appointments/{appointmentId}GETRead-only—
GetAvailability/v1/localbooking/businesses/{businessId}/services/{serviceId}/availabilityGETRead-only—
GetBusiness/v1/localbooking/businesses/{businessId}GETRead-only—
GetReviews/v1/localbooking/businesses/{businessId}/reviewsPOSTRead-only—
GetServices/v1/localbooking/businesses/{businessId}/servicesPOSTRead-only—
GetUserInfo/v1/localbooking/userinfoPOSTRead-onlyREAD_MOBILE_NUMBER, READ_EMAIL, READ_FULL_NAME
UpdateAppointment/v1/localbooking/businesses/{businessId}/appointments/{appointmentId}PUTIdempotent—

Correlation token

Some booking systems maintain correlated state across multiple API calls during a single booking flow. For example, a reservation hold carries from service selection through availability and booking confirmation. The SPI supports an optional opaque correlationToken that lets you carry such state. Your response to GetServices, GetAvailability, and CreateAppointment can include a correlationToken. Alexa+ stores the most recent token and forwards it to subsequent operations in the same flow. This includes post-booking operations like UpdateAppointment, CancelAppointment, and GetAppointment. Alexa+ treats the token as opaque and doesn’t inspect or modify it. If your backend is stateless, omit the correlationToken field. There’s no behavioral impact.

Common request headers

Every operation in the Local Booking SPI includes the following HTTP headers. These are sent by Alexa+ and available in the request context.
HeaderTypeDescriptionRequired
requestIdStringUnique identifier for the request to help with tracking and debuggingNo
timestampTimestampIndicates when the request was initiated. Format: RFC 3339 date-time.No
localeStringThe preferred language for the response content following RFC 5646 format, for example, en-USNo
applicationIdStringIdentifier of the Alexa application making the requestNo
userIdStringUnique identifier of the end user making the request. This field is sensitive and must not be exposed in exception messages or log output.No
userAccessTokenStringAuthentication token for the user’s session. Provided if the user has successfully linked their account. This field is sensitive and must not be exposed in exception messages or log output.No

CancelAppointment

Path: /v1/localbooking/businesses/{businessId}/appointments/{appointmentId}
Method: DELETE
Type: Idempotent
Cancels an existing appointment at the specified business. This operation is idempotent: cancelling an already-cancelled appointment should succeed without error. If a cancellation fee applies (based on business policy), return it in the cancellationFee field. If the cancellation is not allowed (window expired, venue policy, or any other restriction), return CancellationNotAllowedError with a descriptive message.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
appointmentIdStringUnique identifier for the appointmentYes
correlationTokenStringOpaque correlation token persisted from the booking flowNo

Response

A successful CancelAppointmentOutput returns the canceled appointment ID, its final status, and any cancellation fee.
ParameterTypeDescriptionRequired
appointmentIdStringUnique identifier for the canceled appointmentYes
statusAppointmentStatusAppointment status. Always CANCELLED on success.Yes
messageStringHuman-readable message from youNo
cancellationFeeMonetaryValueCancellation fee charged. Omit this field if no fee applies.No
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 404 AppointmentNotFoundError
  • 408 RequestTimeoutError
  • 409 CancellationNotAllowedError
  • 429 RequestThrottlingError
  • 500 InternalServerError

CreateAppointment

Path: /v1/localbooking/businesses/{businessId}/appointments
Method: POST
Type: Non-idempotent
Required Permissions: READ_MOBILE_NUMBER, READ_EMAIL, READ_FULL_NAME
Books a new appointment at the specified business for the selected service and time slot. The optional userDetails (name, email, phone) identifies the customer. If the selected slot is no longer available, return SlotNotAvailableError. The correlationToken from GetAvailability may be passed to maintain booking flow state.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
serviceIdStringUnique identifier for the service to bookYes
teamMemberIdStringUnique identifier for the team member. If omitted, assign any available team member.No
appointmentDateTimeStringAppointment date and time in RFC 3339 format. Must match ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})$. Maximum length: 35 characters.Yes
userDetailsUserDetailsDetails of the person the appointment is being booked forNo
correlationTokenStringOpaque correlation token from the response of the prior operationNo

Response

A successful CreateAppointmentOutput returns the created appointment and its status.
ParameterTypeDescriptionRequired
appointmentIdStringUnique identifier for the created appointmentYes
statusAppointmentStatusBooking statusYes
messageStringHuman-readable message from youNo
appointmentAppointmentFull appointment detailsYes
correlationTokenStringOpaque correlation token for stateful booking systems. See Correlation token.No
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 404 ServiceNotFoundError
  • 408 RequestTimeoutError
  • 409 SlotNotAvailableError
  • 409 TeamMemberNotAvailableError
  • 429 RequestThrottlingError
  • 500 InternalServerError

GetAppointment

Path: /v1/localbooking/businesses/{businessId}/appointments/{appointmentId}
Method: GET
Type: Read-only
Retrieves the current details of a specific appointment. Returns the full appointment record including status, service, team member, date/time, duration, and cost. Alexa+ calls this operation to fetch fresh appointment status from your service for appointments booked through Alexa.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
appointmentIdStringUnique identifier for the appointmentYes
correlationTokenStringOpaque correlation token persisted from the booking flowNo

Response

A successful GetAppointmentOutput returns the full appointment details.
ParameterTypeDescriptionRequired
appointmentAppointmentFull appointment detailsYes
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 404 AppointmentNotFoundError
  • 408 RequestTimeoutError
  • 429 RequestThrottlingError
  • 500 InternalServerError

GetAvailability

Path: /v1/localbooking/businesses/{businessId}/services/{serviceId}/availability
Method: GET
Type: Read-only
Returns available appointment time slots for a specific service within a date range. Each slot includes the start time, duration, and cost. The teamMemberId filter is optional — if omitted, return slots for all available team members. Supports pagination via maxResults and nextToken. Order the results by time, earliest first.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
serviceIdStringUnique identifier for the serviceYes
startDateTimeStringStart of availability window in RFC 3339 format. Must match ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})$. Maximum length: 35 characters.Yes
endDateTimeStringEnd of availability window in RFC 3339 format. Must match ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})$. Maximum length: 35 characters.Yes
teamMemberIdStringFilter slots by a specific team memberNo
correlationTokenStringOpaque correlation token from the response of the prior operationNo
maxResultsIntegerMaximum number of slots to return. Valid range: 1–100.No
nextTokenStringPagination cursor for fetching the next page of resultsNo

Response

A successful GetAvailabilityOutput returns a list of available slots and an optional correlation token.
ParameterTypeDescriptionRequired
availableSlotsList(AvailableSlot)Available appointment slots (maximum 100 items)Yes
correlationTokenStringOpaque correlation token for stateful booking systems. See Correlation token.No
nextTokenStringPagination cursor for the next page of results. Absent when there are no more results.No
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 404 ServiceNotFoundError
  • 408 RequestTimeoutError
  • 429 RequestThrottlingError
  • 500 InternalServerError

GetBusiness

Path: /v1/localbooking/businesses/{businessId}
Method: GET
Type: Read-only
Retrieves business profile information for a given location. Returns business metadata including the business name, physical address, timezone (IANA format), operating hours, and cancellation policy. This information is used to display business details to the customer and validate booking constraints.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes

Response

A successful GetBusinessOutput returns the business metadata.
ParameterTypeDescriptionRequired
businessBusinessDetailsBusiness metadataYes
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 408 RequestTimeoutError
  • 429 RequestThrottlingError
  • 500 InternalServerError

GetReviews

Path: /v1/localbooking/businesses/{businessId}/reviews
Method: POST
Type: Read-only
Retrieves customer reviews and aggregate ratings for a business. Returns the overall rating, total review count, and a list of individual reviews (up to 50). If reviews are not available via your API, return the rating and review count with an empty reviews list. An optional reviewSummary field can provide a pre-generated summary of customer sentiment. Supports pagination via maxResults and nextToken.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
maxResultsIntegerMaximum number of reviews to return. Valid range: 1–50.No
nextTokenStringPagination cursor for fetching the next page of resultsNo

Response

A successful GetReviewsOutput returns the rating, review count, summary, and up to 50 reviews for the business.
ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
ratingDoubleAverage rating from 0 to 5No
reviewCountIntegerTotal number of reviewsNo
reviewSummaryStringSummary of reviewsNo
reviewsList(Review)List of individual reviews (maximum 50 items)No
nextTokenStringPagination cursor for the next page of results. Absent when there are no more results.No
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 408 RequestTimeoutError
  • 429 RequestThrottlingError
  • 500 InternalServerError

GetServices

Path: /v1/localbooking/businesses/{businessId}/services
Method: POST
Type: Read-only
Returns the service catalog for a business, with optional filtering by service name or type. Results can be filtered using serviceQuery (free-text name match) or serviceType (free-form category string). If no filter is provided, return all active services. Supports pagination via maxResults and nextToken. The response may include a correlationToken to maintain state across the booking flow.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
serviceQueryStringFree-text service name search, for example, “Swedish massage” or “haircut and color”No
serviceTypeStringFree-form service category string for filtering. Recommended values include: HAIR_SALON, BARBER, SPA, MASSAGE, NAIL_SALON, MAKEUP, TATTOO, PIERCING, WAXING, BEAUTY_AND_SPA, ACUPUNCTURE, CHIROPRACTOR, TRAINER, TEETH_WHITENING, or any provider-specific category.No
maxResultsIntegerMaximum number of services to return. Valid range: 1–100.No
nextTokenStringPagination cursor for fetching the next page of resultsNo

Response

A successful GetServicesOutput returns a ranked list of matching services and an optional correlation token.
ParameterTypeDescriptionRequired
servicesList(Service)Ranked list of matching services (maximum 100 items)Yes
correlationTokenStringOpaque correlation token for stateful booking systems. See Correlation token.No
nextTokenStringPagination cursor for the next page of results. Absent when there are no more results.No
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 408 RequestTimeoutError
  • 429 RequestThrottlingError
  • 500 InternalServerError

GetUserInfo

Path: /v1/localbooking/userinfo
Method: POST
Type: Read-only
Required Permissions: READ_MOBILE_NUMBER, READ_EMAIL, READ_FULL_NAME
Resolves or retrieves user identity at the provider system. Looks up the customer using the provided userDetails (name, email, phone) and returns the resolved user information. The optional businessId is needed for providers with per-business user isolation. If the user does not exist, either create a new user record and return their details, or return UserNotFoundError if user creation is not supported.

Request

ParameterTypeDescriptionRequired
businessIdStringBusiness identifier — needed for providers with per-business user isolationNo
userDetailsUserDetailsDetails of the user to look upNo
correlationTokenStringOpaque correlation token from the response of the prior operationNo

Response

A successful GetUserInfoOutput returns the matched user profile details.
ParameterTypeDescriptionRequired
userDetailsUserDetailsMatched user detailsYes
correlationTokenStringOpaque correlation token for stateful booking systems. See Correlation token.No
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 UserNotFoundError
  • 408 RequestTimeoutError
  • 429 RequestThrottlingError
  • 500 InternalServerError

UpdateAppointment

Path: /v1/localbooking/businesses/{businessId}/appointments/{appointmentId}
Method: PUT
Type: Idempotent
Reschedules an existing appointment to a new date and time. The serviceId and teamMemberId are optional — if omitted, the original service and team member are retained. This operation is idempotent. If the business policy blocks rescheduling (for example, too close to the appointment time or venue restriction), return CancellationNotAllowedError.

Request

ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
appointmentIdStringUnique identifier for the appointmentYes
serviceIdStringUnique identifier for the service. If omitted, retains the original service.No
teamMemberIdStringUnique identifier for the team member. If omitted, retains the original team member.No
appointmentDateTimeStringNew appointment date and time in RFC 3339 format. Must match ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})$. Maximum length: 35 characters.Yes
correlationTokenStringOpaque correlation token from the response of the prior operationNo

Response

A successful UpdateAppointmentOutput returns the updated appointment and its status.
ParameterTypeDescriptionRequired
appointmentIdStringUnique identifier for the updated appointmentYes
statusAppointmentStatusAppointment statusYes
messageStringHuman-readable message from youNo
appointmentAppointmentFull updated appointment detailsYes
correlationTokenStringOpaque correlation token for stateful booking systems. See Correlation token.No
On error, the response returns one of the following error codes:
  • 400 ValidationException
  • 404 BusinessNotFoundError
  • 404 ServiceNotFoundError
  • 404 AppointmentNotFoundError
  • 408 RequestTimeoutError
  • 409 SlotNotAvailableError
  • 409 TeamMemberNotAvailableError
  • 409 CancellationNotAllowedError
  • 429 RequestThrottlingError
  • 500 InternalServerError

Components

Address

Physical address structure with required fields for business location.
ParameterTypeDescriptionRequired
addressLine1StringPrimary street address line. This field is sensitive.Yes
addressLine2StringSecondary address line (apt, suite, unit, etc.). This field is sensitive.No
addressLine3StringAdditional address line. This field is sensitive.No
cityStringCity or locality nameYes
stateOrRegionStringState, region, or provinceYes
districtOrCountyStringDistrict or countyNo
countryCodeStringISO 3166-1 alpha-2 country code, for example, US. Exactly 2 characters.Yes
postalCodeStringPostal or ZIP codeYes

Appointment

Full appointment record.
ParameterTypeDescriptionRequired
appointmentIdStringUnique identifier for the appointmentYes
businessBusinessInfoBusiness info (nested in Appointment)Yes
serviceServiceInfoService info (nested in Appointment)Yes
teamMemberTeamMemberTeam member/staff. Optional if not yet assigned.No
appointmentDateTimeStringAppointment date and time in RFC 3339 format. Must match ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})$. Maximum length: 35 characters.Yes
durationInMinutesIntegerDuration in minutesYes
costMonetaryValuePrice before taxYes
costWithTaxMonetaryValuePrice with tax. Omit if not available.No
statusAppointmentStatusCurrent appointment statusYes

AppointmentStatus

Lifecycle status of an appointment.

AvailableSlot

An available time slot returned by GetAvailability.
ParameterTypeDescriptionRequired
dateTimeStringSlot start time in RFC 3339 format. Must match ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})$. Maximum length: 35 characters.Yes
teamMemberTeamMemberTeam member for this slot. Optional — some providers assign team member at reservation time.No
durationInMinutesIntegerDuration in minutesYes
costMonetaryValuePrice before taxYes
costWithTaxMonetaryValuePrice with tax. Omit if not available.No

BusinessDetails

Business metadata returned by GetBusiness.
ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
businessNameStringDisplay name of the businessYes
descriptionStringBusiness descriptionNo
addressAddressPhysical addressYes
phoneNumberPhoneNumberBusiness contact phone number. This field is sensitive.No
websiteUrlStringBusiness website URL. Must match ^https://.+$. Minimum length: 1 character.No
timezoneStringInternet Assigned Numbers Authority (IANA) timezone identifier, for example, America/Los_Angeles. Maximum length: 64 characters.No
operatingHoursList(OperatingHours)Weekly operating hoursNo
cancellationPolicyCancellationPolicyCancellation policy for bookings at this businessNo

BusinessInfo

Business identification nested inside an Appointment.
ParameterTypeDescriptionRequired
businessIdStringUnique identifier for the businessYes
businessNameStringDisplay name of the businessYes

CancellationPolicy

Details of the cancellation policy that applies to bookings at a business.
ParameterTypeDescriptionRequired
policyTextStringHuman-readable policy textYes
cancellationWindowHoursIntegerNumber of hours before the appointment by which the customer must cancelNo
hasCancellationFeeBooleanWhether a cancellation fee appliesYes
cancellationFeeAmountMonetaryValueCancellation fee amount. Present when hasCancellationFee is true.No

DayOfWeek

Day of the week.

MonetaryValue

A monetary amount with currency. The value field uses a decimal string representation to avoid floating-point precision issues. Negative values are permitted (for example, discounts, refunds).
ParameterTypeDescriptionRequired
currencyCodeStringISO 4217 three-letter currency code, for example, USD. Exactly 3 characters.Yes
valueStringDecimal string representation of the amount, for example, 45.00. Must match ^[+-]?[0-9]+(\.[0-9]+)?$. Maximum length: 128 characters.Yes

OperatingHours

Operating hours for a specific day of the week. Only include days the business is open. Absence from the list means closed.
ParameterTypeDescriptionRequired
dayOfWeekDayOfWeekDay of the weekYes
openTimeStringOpening time in HH:mm:ss format, for example, 09:00:00. Exactly 8 characters. Must match ^\d{2}:\d{2}:\d{2}$.Yes
closeTimeStringClosing time in HH:mm:ss format, for example, 17:30:00. Exactly 8 characters. Must match ^\d{2}:\d{2}:\d{2}$.Yes

PhoneNumber

Phone number with country code separation. This structure is sensitive and must not be exposed in exception messages or log output.
ParameterTypeDescriptionRequired
countryCallingCodeStringCountry calling code, for example, 1 for US, 91 for India. Must match ^[1-9]\d{0,2}$. Maximum length: 3 characters.Yes
numberStringSubscriber number without country code. Must match ^\d{4,14}$. Length: 4–14 characters. This field is sensitive.Yes

Review

An individual customer review of a business.
ParameterTypeDescriptionRequired
reviewIdStringUnique identifier for the reviewYes
authorNameStringDisplay name of the review authorNo
ratingDoubleRating from 0 to 5Yes
textStringReview textNo
dateStringReview date in ISO 8601 format (YYYY-MM-DD). Exactly 10 characters. Must match ^\d{4}-\d{2}-\d{2}$.No

Service

A bookable service offered by a business. The serviceType field is a free-form string to accommodate diverse provider category systems.
ParameterTypeDescriptionRequired
serviceIdStringUnique identifier for the serviceYes
serviceNameStringDisplay name of the serviceYes
serviceDescriptionStringService descriptionNo
serviceTypeStringFree-form service category string. Recommended values include: HAIR_SALON, BARBER, SPA, MASSAGE, NAIL_SALON, MAKEUP, TATTOO, PIERCING, WAXING, BEAUTY_AND_SPA, ACUPUNCTURE, CHIROPRACTOR, TRAINER, TEETH_WHITENING, or any provider-specific category.No
minCostMonetaryValueMinimum price for the serviceYes
maxCostMonetaryValueMaximum price. Omit if the service has a fixed price.No
minDurationInMinutesIntegerMinimum duration in minutesYes
maxDurationInMinutesIntegerMaximum duration in minutes. Omit if the service has a fixed duration.No

ServiceInfo

Service identification nested inside an Appointment.
ParameterTypeDescriptionRequired
serviceIdStringUnique identifier for the serviceYes
serviceNameStringDisplay name of the serviceYes

TeamMember

A team member or staff member at a business.
ParameterTypeDescriptionRequired
teamMemberIdStringUnique identifier for the team memberYes
teamMemberNameStringFull name as a single string, for example, “Jane Doe”. Length: 1–100 characters. This field is sensitive.Yes

UserDetails

Identity details for the customer receiving the appointment. All fields in this structure are sensitive and must not be exposed in log output.
ParameterTypeDescriptionRequired
nameStringFull name of the customer. Length: 1–100 characters. This field is sensitive.No
emailStringEmail address of the customer. Must match ^[^@\s]+@[^@\s]+\.[^@\s]+$. Length: 5–254 characters. This field is sensitive.No
phoneNumberPhoneNumberPhone number of the customer with country code. This field is sensitive.No

Errors

All error responses share a common structure with errorType, errorCode, and message fields.

Error response example

Error codes

Date and time format

All date and time values use ISO 8601 / RFC 3339 with an explicit timezone offset. Don’t use Z for local times.
Use IANA identifiers for the timezone field on BusinessDetails, for example, America/Los_Angeles. Use HH:mm:ss format for time-only values on OperatingHours, for example, 09:00:00.
Last modified on July 21, 2026