Prerequisites
Before you begin, make sure you have set up your development environment. For details, see Set Up Your Development Environment. You choose the category for your add-on when you initialize your projet. You can select from one of the following categories:- Food Ordering
- Home Services
- Local Booking
- Restaurant Reservation
- Ticketing
High-level steps for building a category add-on
You complete the following steps to build your add-on.- Initialize a new project for your intended category. This provides you with the initial starter code. See Initialize your add-on project.
- Implement the Service Provider Interfaces (SPIs) to call your APIs. See Implement the SPI handlers.
- Configure the add-on manifest file with required metadata for your add-on. See Configure the add-on manifest.
- Configure account linking if needed. Account linking is required for operations that modify user data.
- Build and deploy the add-on for testing. See Deploy the add-on.
- For categories that require local search, such as restaurant reservation, define a test Point of Interest (POI) catalog and associate it with your add-on. See Prepare Point of Interest (POI) data
- Test your add-on. You both test locally to validate your SPI implementation, and also test in the web simulator and on an Alexa device. See Test your add-on.
- Submit the add-on for certification. See Certification

Category add-on flow
Initialize your add-on project
You use the Alexa AI CLI to create a new add-on project. This step installs a category-specific starter package and its dependencies. In this release, you can choose from the following categories:- Food Ordering
- Home Services
- Local Booking
- Restaurant Reservation
- Ticketing
cdk for the backend.
Open a command prompt and navigate to the directory where you want to create the add-on. Run the alexa-ai new action command. Respond to the prompts in the command line wizard.
- Food Ordering
- Home Services
- Local Booking
- Restaurant Reservation
- Ticketing
Implement the SPI handlers
The starter package provides stub implementations with mock data in theaction/<category-name>/src/operations directory. You replace the mock logic in these files with real calls to your APIs.
Architecture pattern
action/<category-name>/src/handlers. These files are generated and you don’t normally need to make changes to them.
- Food Ordering
- Home Services
- Local Booking
- Restaurant Reservations
- Ticketing
action/<category-name>/src/operations.
- Food Ordering
- Home Services
- Local Booking
- Restaurant Reservations
- Ticketing
- Food Ordering
- Home Services
- Local Booking
- Restaurant Reservation
- Ticketing
| Operation | Purpose |
|---|---|
BatchGetMenuItems | Retrieve detailed information for multiple menu items |
CancelPurchase | Cancel an in-progress purchase |
CreateCartItem | Add a menu item selection to a cart |
CreatePurchase | Create a new purchase (checkout session) |
DeleteCartItem | Remove an item from a cart |
GetAddresses | Get saved delivery addresses for the user |
GetMenuItem | Get details and customization options for a menu item |
GetPaymentMethods | Get saved payment methods for the user |
GetPurchase | Get details of an in-progress purchase |
GetRestaurant | Get details for a specific restaurant |
GetRestaurantAvailability | Check restaurant availability for ordering |
PreviewPurchase | Generate a checkout preview before submission |
RecreatePurchase | Recreate a purchase from a previous order |
SearchOrders | Search for placed orders |
SearchPurchases | Search for active purchases (in-progress checkouts) |
SubmitPurchase | Submit a purchase and place the order |
UpdateCartItem | Update a cart item with new selections |
UpdatePurchase | Update payment, tip, or fulfillment details |
action/<category-name>/tests/ for each operation. Update these with test cases that cover your actual business logic.
Use the following command to run the tests:
Add-on configuration
Configure the add-on manifest
Updateaddon-package/addon.json with your brand information and metadata for your add-on. The following tables show the manifest fields.
Top-level fields
| Field | Description | Required |
|---|---|---|
manifestVersion | Schema version (e.g., "1.0") | Yes |
storeListing.distributionCountries | Country codes where add-on is available (only "US" for initial launch) | Yes |
storeListing.locales | Locale-keyed store metadata (at least one required; "en-US" for launch) | Yes |
permissions | Contains a usage description and the aggregated list of all permission scopes required by the add-on. Not required if your your add-on doesn’t require any customer data. | No |
permissions.locales | Locale-keyed object containing localizable permission properties. At least one required: en-US for initial launch. | Yes |
permissions.locales.<locale>.usageDescription | Description of how your add-on uses the requested customer data. Shown to customers in the consent prompt to help them make an informed decision. Max 200 characters. | Yes |
permissions.scopes[].name | Array of scopes. Each scope is an object with a name field. | Yes |
integrations | Array of integration entries (at least one required). | Yes |
Per-locale fields
These fields are understoreListing.locales.en-US.
| Field | Description | Required |
|---|---|---|
name.value | Display name in Alexa+ Store (max 30 chars) | Yes |
name.spokenForm | Voice-friendly invocation name if different from display name (e.g., “Verbo” for VRBO) | No |
shortDescription | Summary shown in add-on list (max 123 chars) | Yes (on submit) |
fullDescription | Full description with limited markup support: \n, - , **bold** (max 4000 chars) | Yes (on submit) |
examplePhrases | Sample utterances to invoke add-on (min 3, max 4 items, max 200 chars each) | Yes (on submit) |
recentChanges | Updates made with the latest release | Yes (on submit) |
mediaAssets.icons.light | Light theme icons — all sizes required: 72x72, 64x64, 88x88, 126x126, 180x180, 241x241 | Yes (on submit) |
mediaAssets.icons.dark | Dark theme icons — same sizes as light | No |
mediaAssets.carouselImages | Carousel images for store page (600x900 px, max 5, with altText) | Yes (on submit) |
mediaAssets.bannerImages | Hero images for mobile/tablet (1200x600 and 1200x300, with altText) | No |
privacyAndCompliance.privacyPolicyUrl | HTTPS URL to privacy policy | Yes (on submit) |
privacyAndCompliance.termsOfUseUrl | HTTPS URL to terms of use | Yes (on submit) |
- You must use an internet-accessible endpoint URL. Alexa copies the content and hosts it during deploy.
- Logos are mandatory for the Category SDK and must be included for you to deploy your add-on.
Example of manifest add-on.json
Example of manifest add-on.json
SPI configuration
The starter package includes the fileaddon-package/action/<SPI>-config.json. Don’t edit this file directly. The alexa-ai deploy command overwrites the contents of this file using config_builder.ts.
- Food Ordering
- Home Services
- Local Booking
- Restaurant Reservations
- Ticketing
Deploy the add-on
You deploy your add-on through three separate steps.- Deploy your backend infrastructure to AWS with basic authentication enabled for testing purposes.
- Deploy your backend infrastructure to AWS with basic authentication disabled.
- Deploy your add-on manifest to Alexa+.
Install dependencies and build code
Registry access was configured when you ran the script to configure npm for the private CodeArtifact registry. Before bootstrapping, review the stack name inaction/infrastructure/cdk/bin/app.ts. The default name is shared across all projects created from this template. If multiple add-ons use the same stack name in the same AWS account, they share one CloudFormation stack — updating or destroying it affects all of them. Rename it to something unique, such as MyRestaurantApp-AddOn.
Use the following commands to install project dependencies:
Deploy AWS infrastructure for endpoint testing
You deploy your Lambda functions and API Gateway to your own AWS account with basic authentication enabled. This lets you test your API endpoint and validate SPI contract compliance. Your add-on doesn’t accept actual Alexa requests during this phase. Set your basic auth credentials as environment variables:Deploy AWS infrastructure
Once you have verified that your endpoint works correctly, you can deploy again basic auth disabled. Run the following command:Update endpoint configuration
Updateaction/<category-name>/src/config_builder.ts with your actual endpoint:
Deploy the add-on
Run the following command to deploy your add-on..alexa-ai/config.json). Subsequent deployments create new versions.
Use --ignore-hash to force a redeploy even if no manifest changes are detected:
Check for library updates
Use standard npm tooling to check for outdated dependencies:@alexa-ai/* dependencies. To update:
npm outdated, identify updates, and apply the necessary package.json changes.
After updating dependencies, redeploy: npm run build && npm run deploy && alexa-ai deploy --ignore-hash
Prepare Point of Interest (POI) data
Point of Interest (POI) data is required for categories that involve local search, such as Restaurant Reservations. Test data enables sandboxed (isolated) testing before certification. Note that test catalogs are scoped to the add-on. If multiple developer accounts upload catalogs for the same add-on, the latest upload overrides any previous uploads. All accounts access the same catalog when testing in simulator. For the accepted POI data format, refer to Point of Interest Catalog Schema. When you upload your catalog, you use the--usage parameter to specify whether it is test or production data.
Define a catalog and associate it with your add-on.
Create the test catalog with thecreate-catalog command.
associate-catalog-with-addon command.
Upload test data
Upload the data with theupload-catalog command. You can do the upload repeatedly to modify test data. Any new catalog upload replaces the previously uploaded catalog.
get-content-upload-by-id command to check the status of the upload.
Test your add-on
After you deploy, test your add-on to validate your SPI implementation, verify end-to-end functionality, and confirm account linking works correctly. For details, see Test Your Category Action Add-on.Ingest Production POI Data
Before you submit your add-on for certification, ingest your production POI data. The flow is the same as test data ingestion but uses the production--usage value. (Alexa.Catalog.PointOfInterest)
Create the catalog with the create-catalog command.
associate-catalog-with-addon command.
upload-catalog command. Upload production data at a regular cadence to ensure catalog is up-to-date.
get-content-upload-by-id command to check the status of your upload.
--usage Alexa.Catalog.PointOfInterest instead of Alexa.Catalog.PointOfInterest.Test. Production POI data is required before certification for categories involving local search.

