Local Booking SPI
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:
- Alexa+ calls GetServices to match the requested service against your catalog.
- Alexa+ calls GetAvailability to find open time slots for the selected service.
- Alexa+ calls GetBusiness to retrieve the cancellation policy for the business before confirmation.
- 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.
| Operation | Path | HTTP method | Type | Requires permissions |
|---|---|---|---|---|
|
|
DELETE |
Idempotent |
— | |
|
|
POST |
Non-idempotent |
| |
|
|
GET |
Read-only |
— | |
|
|
GET |
Read-only |
— | |
|
|
GET |
Read-only |
— | |
|
|
POST |
Read-only |
— | |
|
|
POST |
Read-only |
— | |
|
|
POST |
Read-only |
| |
|
|
PUT |
Idempotent |
— |
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.
| Header | Type | Description | Required |
|---|---|---|---|
|
requestId |
String |
Unique identifier for the request to help with tracking and debugging |
No |
|
timestamp |
Timestamp |
Indicates when the request was initiated. Format: RFC 3339 date-time. |
No |
|
locale |
String |
The preferred language for the response content following RFC 5646 format, for example, |
No |
|
applicationId |
String |
Identifier of the Alexa application making the request |
No |
|
userId |
String |
Unique identifier of the end user making the request. This field is sensitive and must not be exposed in exception messages or log output. |
No |
|
userAccessToken |
String |
Authentication 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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
appointmentId |
String |
Unique identifier for the appointment |
Yes |
|
correlationToken |
String |
Opaque correlation token persisted from the booking flow |
No |
Response
A successful CancelAppointmentOutput returns the canceled appointment ID, its final status, and any cancellation fee.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
appointmentId |
String |
Unique identifier for the canceled appointment |
Yes |
|
status |
Appointment status. Always |
Yes | |
|
message |
String |
Human-readable message from you |
No |
|
cancellationFee |
Cancellation 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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
serviceId |
String |
Unique identifier for the service to book |
Yes |
|
teamMemberId |
String |
Unique identifier for the team member. If omitted, assign any available team member. |
No |
|
appointmentDateTime |
String |
Appointment date and time in RFC 3339 format. Must match |
Yes |
|
userDetails |
Details of the person the appointment is being booked for |
No | |
|
correlationToken |
String |
Opaque correlation token from the response of the prior operation |
No |
Response
A successful CreateAppointmentOutput returns the created appointment and its status.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
appointmentId |
String |
Unique identifier for the created appointment |
Yes |
|
status |
Booking status |
Yes | |
|
message |
String |
Human-readable message from you |
No |
|
appointment |
Full appointment details |
Yes | |
|
correlationToken |
String |
Opaque 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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
appointmentId |
String |
Unique identifier for the appointment |
Yes |
|
correlationToken |
String |
Opaque correlation token persisted from the booking flow |
No |
Response
A successful GetAppointmentOutput returns the full appointment details.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
appointment |
Full appointment details |
Yes |
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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
serviceId |
String |
Unique identifier for the service |
Yes |
|
startDateTime |
String |
Start of availability window in RFC 3339 format. Must match |
Yes |
|
endDateTime |
String |
End of availability window in RFC 3339 format. Must match |
Yes |
|
teamMemberId |
String |
Filter slots by a specific team member |
No |
|
correlationToken |
String |
Opaque correlation token from the response of the prior operation |
No |
|
maxResults |
Integer |
Maximum number of slots to return. Valid range: 1–100. |
No |
|
nextToken |
String |
Pagination cursor for fetching the next page of results |
No |
Response
A successful GetAvailabilityOutput returns a list of available slots and an optional correlation token.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
availableSlots |
List(AvailableSlot) |
Available appointment slots (maximum 100 items) |
Yes |
|
correlationToken |
String |
Opaque correlation token for stateful booking systems. See Correlation token. |
No |
|
nextToken |
String |
Pagination 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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
Response
A successful GetBusinessOutput returns the business metadata.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
business |
Business metadata |
Yes |
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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
maxResults |
Integer |
Maximum number of reviews to return. Valid range: 1–50. |
No |
|
nextToken |
String |
Pagination cursor for fetching the next page of results |
No |
Response
A successful GetReviewsOutput returns the rating, review count, summary, and up to 50 reviews for the business.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
rating |
Double |
Average rating from 0 to 5 |
No |
|
reviewCount |
Integer |
Total number of reviews |
No |
|
reviewSummary |
String |
Summary of reviews |
No |
|
reviews |
List(Review) |
List of individual reviews (maximum 50 items) |
No |
|
nextToken |
String |
Pagination 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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
serviceQuery |
String |
Free-text service name search, for example, "Swedish massage" or "haircut and color" |
No |
|
serviceType |
String |
Free-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 |
|
maxResults |
Integer |
Maximum number of services to return. Valid range: 1–100. |
No |
|
nextToken |
String |
Pagination cursor for fetching the next page of results |
No |
Response
A successful GetServicesOutput returns a ranked list of matching services and an optional correlation token.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
services |
List(Service) |
Ranked list of matching services (maximum 100 items) |
Yes |
|
correlationToken |
String |
Opaque correlation token for stateful booking systems. See Correlation token. |
No |
|
nextToken |
String |
Pagination 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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Business identifier — needed for providers with per-business user isolation |
No |
|
userDetails |
Details of the user to look up |
No | |
|
correlationToken |
String |
Opaque correlation token from the response of the prior operation |
No |
Response
A successful GetUserInfoOutput returns the matched user profile details.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
userDetails |
Matched user details |
Yes | |
|
correlationToken |
String |
Opaque 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
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
appointmentId |
String |
Unique identifier for the appointment |
Yes |
|
serviceId |
String |
Unique identifier for the service. If omitted, retains the original service. |
No |
|
teamMemberId |
String |
Unique identifier for the team member. If omitted, retains the original team member. |
No |
|
appointmentDateTime |
String |
New appointment date and time in RFC 3339 format. Must match |
Yes |
|
correlationToken |
String |
Opaque correlation token from the response of the prior operation |
No |
Response
A successful UpdateAppointmentOutput returns the updated appointment and its status.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
appointmentId |
String |
Unique identifier for the updated appointment |
Yes |
|
status |
Appointment status |
Yes | |
|
message |
String |
Human-readable message from you |
No |
|
appointment |
Full updated appointment details |
Yes | |
|
correlationToken |
String |
Opaque 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.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
addressLine1 |
String |
Primary street address line. This field is sensitive. |
Yes |
|
addressLine2 |
String |
Secondary address line (apt, suite, unit, etc.). This field is sensitive. |
No |
|
addressLine3 |
String |
Additional address line. This field is sensitive. |
No |
|
city |
String |
City or locality name |
Yes |
|
stateOrRegion |
String |
State, region, or province |
Yes |
|
districtOrCounty |
String |
District or county |
No |
|
countryCode |
String |
ISO 3166-1 alpha-2 country code, for example, |
Yes |
|
postalCode |
String |
Postal or ZIP code |
Yes |
Appointment
Full appointment record.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
appointmentId |
String |
Unique identifier for the appointment |
Yes |
|
business |
Business info (nested in Appointment) |
Yes | |
|
service |
Service info (nested in Appointment) |
Yes | |
|
teamMember |
Team member/staff. Optional if not yet assigned. |
No | |
|
appointmentDateTime |
String |
Appointment date and time in RFC 3339 format. Must match |
Yes |
|
durationInMinutes |
Integer |
Duration in minutes |
Yes |
|
cost |
Price before tax |
Yes | |
|
costWithTax |
Price with tax. Omit if not available. |
No | |
|
status |
Current appointment status |
Yes |
AppointmentStatus
Lifecycle status of an appointment.
enum AppointmentStatus {
PENDING
CONFIRMED
CANCELLED
COMPLETED
NO_SHOW
}
| Value | Description |
|---|---|
| PENDING | Booking request awaits your confirmation |
| CONFIRMED | Confirmed and scheduled |
| CANCELLED | Canceled |
| COMPLETED | Appointment has been completed |
| NO_SHOW | Customer did not show up |
AvailableSlot
An available time slot returned by GetAvailability.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
dateTime |
String |
Slot start time in RFC 3339 format. Must match |
Yes |
|
teamMember |
Team member for this slot. Optional — some providers assign team member at reservation time. |
No | |
|
durationInMinutes |
Integer |
Duration in minutes |
Yes |
|
cost |
Price before tax |
Yes | |
|
costWithTax |
Price with tax. Omit if not available. |
No |
BusinessDetails
Business metadata returned by GetBusiness.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
businessName |
String |
Display name of the business |
Yes |
|
description |
String |
Business description |
No |
|
address |
Physical address |
Yes | |
|
phoneNumber |
Business contact phone number. This field is sensitive. |
No | |
|
websiteUrl |
String |
Business website URL. Must match |
No |
|
timezone |
String |
Internet Assigned Numbers Authority (IANA) timezone identifier, for example, |
No |
|
operatingHours |
List(OperatingHours) |
Weekly operating hours |
No |
|
cancellationPolicy |
Cancellation policy for bookings at this business |
No |
BusinessInfo
Business identification nested inside an Appointment.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
businessId |
String |
Unique identifier for the business |
Yes |
|
businessName |
String |
Display name of the business |
Yes |
CancellationPolicy
Details of the cancellation policy that applies to bookings at a business.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
policyText |
String |
Human-readable policy text |
Yes |
|
cancellationWindowHours |
Integer |
Number of hours before the appointment by which the customer must cancel |
No |
|
hasCancellationFee |
Boolean |
Whether a cancellation fee applies |
Yes |
|
cancellationFeeAmount |
Cancellation fee amount. Present when |
No |
DayOfWeek
Day of the week.
enum DayOfWeek {
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
}
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).
| Parameter | Type | Description | Required |
|---|---|---|---|
|
currencyCode |
String |
ISO 4217 three-letter currency code, for example, |
Yes |
|
value |
String |
Decimal string representation of the amount, for example, |
Yes |
OperatingHours
Operating hours for a specific day of the week. Only include days the business is open. Absence from the list means closed.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
dayOfWeek |
Day of the week |
Yes | |
|
openTime |
String |
Opening time in |
Yes |
|
closeTime |
String |
Closing time in |
Yes |
PhoneNumber
Phone number with country code separation. This structure is sensitive and must not be exposed in exception messages or log output.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
countryCallingCode |
String |
Country calling code, for example, |
Yes |
|
number |
String |
Subscriber number without country code. Must match |
Yes |
Review
An individual customer review of a business.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
reviewId |
String |
Unique identifier for the review |
Yes |
|
authorName |
String |
Display name of the review author |
No |
|
rating |
Double |
Rating from 0 to 5 |
Yes |
|
text |
String |
Review text |
No |
|
date |
String |
Review date in ISO 8601 format ( |
No |
Service
A bookable service offered by a business. The serviceType field is a free-form string to accommodate diverse provider category systems.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
serviceId |
String |
Unique identifier for the service |
Yes |
|
serviceName |
String |
Display name of the service |
Yes |
|
serviceDescription |
String |
Service description |
No |
|
serviceType |
String |
Free-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 |
|
minCost |
Minimum price for the service |
Yes | |
|
maxCost |
Maximum price. Omit if the service has a fixed price. |
No | |
|
minDurationInMinutes |
Integer |
Minimum duration in minutes |
Yes |
|
maxDurationInMinutes |
Integer |
Maximum duration in minutes. Omit if the service has a fixed duration. |
No |
ServiceInfo
Service identification nested inside an Appointment.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
serviceId |
String |
Unique identifier for the service |
Yes |
|
serviceName |
String |
Display name of the service |
Yes |
TeamMember
A team member or staff member at a business.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
teamMemberId |
String |
Unique identifier for the team member |
Yes |
|
teamMemberName |
String |
Full 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.
| Parameter | Type | Description | Required |
|---|---|---|---|
|
name |
String |
Full name of the customer. Length: 1–100 characters. This field is sensitive. |
No |
|
|
String |
Email address of the customer. Must match |
No |
|
phoneNumber |
Phone 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
{
"errorType": "CLIENT_ERROR",
"errorCode": "SLOT_NOT_AVAILABLE_ERROR",
"message": "The requested time slot is no longer available"
}
Error codes
| HTTP status | Error | When |
|---|---|---|
| 400 | ValidationException | The request contains malformed or missing required fields |
| 404 | BusinessNotFoundError | The business ID doesn't exist |
| 404 | ServiceNotFoundError | The service ID doesn't exist |
| 404 | AppointmentNotFoundError | The appointment ID doesn't exist |
| 404 | UserNotFoundError | The user cannot be identified or created at the provider |
| 408 | RequestTimeoutError | You didn't respond within the required time limit |
| 409 | SlotNotAvailableError | The requested time slot is no longer available |
| 409 | TeamMemberNotAvailableError | The requested team member is unavailable |
| 409 | CancellationNotAllowedError | Cancellation or rescheduling is not allowed for this appointment (window expired, venue policy, or other restriction) |
| 429 | RequestThrottlingError | Rate limit exceeded |
| 500 | InternalServerError | Unexpected error on your side |
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.
2026-02-15T14:30:00-08:00
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.
Related topics
- Overview of the Category SDK
- Create a Category Add-on Manually with the CLI
- Set Up Your Development Environment
Last updated: Jul 21, 2026

