Point of Interest Catalog Schema
The Point of Interest (POI) catalog schema defines the standardized format for submitting POI data to Alexa+. Use it to surface accurate, current business and location information to customers through voice and other interfaces.
Overview
A POI is any named geographic location that is relevant to customers, including restaurants, hotels, gas stations, hospitals, electric vehicle (EV) charging stations, retail stores, and more. Alexa+ uses POI data to answer customer queries such as:
- "Alexa, find Italian restaurants near me."
- "Alexa, what are the hours for [your business name]?"
- "Alexa, is there EV charging nearby?"
- "Alexa, book a table at [xyz restaurant]."
Complete, accurate data submissions produce better Alexa+ responses and customer experiences.
Submission format
You must submit all POI records as JSON objects conforming to this schema. Each JSON object represents a single POI location.
Requirement levels
In this document, each field has one of three requirement levels:
| Label | Meaning |
|---|---|
| Required | Must be present in every record. Alexa+ rejects any submission that is missing a required field. |
| Recommended | Strongly encouraged. Omitting recommended fields reduces data quality and may limit Alexa+ features. |
| Optional | You should provide it when available. It enhances the richness of the POI record. |
Submission rules
- Each POI record must have a unique
idthat is stable across submissions. - All URLs must use
https://orhttp://and mustn't contain spaces. - Locale codes must follow BCP-47 format (for example,
en-US,ja-JP). - Country codes must follow ISO 3166-1 alpha-2 format (for example,
US,GB,FR). - Currency codes must follow ISO 4217 3-letter format (for example,
USD,EUR,JPY).
Field requirements at a glance
| Field | Type | Requirement |
|---|---|---|
| id | string | Required |
| name | array of Name | Required (minimum one) |
| address | array of Address | Required (minimum one) |
| location | Location object | Recommended |
| operatingInfo | OperatingInfo object | Recommended |
| phone | string | Recommended |
| website | string (URL) | Recommended |
| categories | array of string | Recommended |
| ratings | Ratings object | Recommended |
| alexaSupportedActions | array of string enum | Recommended |
| alternateNames | array of string | Optional |
| description | array of Description | Optional |
| media | Media object | Optional |
| relationships | Relationships object | Optional |
| attributes | Attribute object | Optional |
| priceRange | integer (1-4) | Optional |
| costForTwo | MonetaryValue object | Optional |
| actionUrls | ActionUrls object | Optional |
| lastUpdated | string (ISO 8601 date-time) | Optional |
Top-level fields
id
Requirement: Required
Type: string
A unique, stable identifier for this POI. Alexa+ uses this ID to match records across submissions for updates and deduplication.
name
Requirement: Required
Type: array of Name
Minimum items: one
The business name for this POI in one or more locales. Provide multiple entries to represent the same name in different locales, not to list alternate names. At least one entry is required. For alternate names, use the alternateNames field.
address
Requirement: Required
Type: array of Address
Minimum items: one
The physical address(es) of the POI. At least one address is required. See the Address for required sub-fields and country-specific rules. Alexa+ treats the first entry in the array as the primary address.
location
Requirement: Recommended
Type: Location object
Geographic coordinates for the POI. If you omit this field, Alexa+ attempts to geocode the address, but Amazon strongly recommends that you supply precise coordinates.
operatingInfo
Requirement: Recommended
Type: OperatingInfo object
Operating hours, special hours, and closure status. Providing this data enables Alexa+ to answer questions like "Is [xyz business] open right now?"
phone
Requirement: Recommended
Type: string
The primary phone number for the business. Include the country code (for example, +1-xxx-xxx-xxxx).
website
Requirement: Recommended
Type: string (URL)
The official website URL for the business. Must begin with http:// or https://.
categories
Requirement: Recommended
Type: array of string
A list of business category labels that best describe this POI. Use widely recognized category names and synonyms where possible (for example, "Coffee Shop", "Restaurant", "Gas Station", "Mexican restaurant", "Massage", "Convenience store", "Grocery Store").
alternateNames
Requirement: Optional
Type: array of string
Additional names the business may be known by, such as trade names, abbreviations, or commonly used nicknames.
description
Requirement: Optional
Type: array of Description
Locale-specific descriptions of the business.
media
Requirement: Optional
Type: Media object
Photos and images of the business.
ratings
Requirement: Recommended
Type: Ratings object
User ratings, review counts, individual reviews, awards, and ranking information.
relationships
Requirement: Optional
Type: Relationships object
Identifies chain affiliations, business groups, and spatial containment relationships between POIs.
attributes
Requirement: Optional
Type: Attribute object
Detailed POI characteristics including amenities, cuisine types, parking, payment methods, and more.
priceRange
Requirement: Optional
Type: integer
A price level indicator from one to four.
| Value | Meaning |
|---|---|
| 1 | Inexpensive |
| 2 | Moderate |
| 3 | Expensive |
| 4 | Very expensive |
costForTwo
Requirement: Optional
Type: MonetaryValue object
The estimated average cost for two people at this establishment.
alexaSupportedActions
Requirement: Recommended
Type: array of string enum
Specifies which task-completion actions Alexa+ can perform for this POI. Currently supports two values: BOOKING, DELIVERY. If you omit this field, Alexa+ can't perform task-completion actions for this POI.
| Value | Description |
|---|---|
| "BOOKING" | Alexa+ can initiate a reservation or appointment booking |
| "DELIVERY" | Alexa+ can initiate a food delivery order |
actionUrls
Requirement: Optional
Type: ActionUrls object
Deep-link URLs that users can use to initiate task-completion actions for this POI, such as booking or food ordering.
lastUpdated
Requirement: Optional
Type: string (ISO 8601 date-time)
The timestamp of the last update to this POI record. Format: yyyy-MM-ddTHH:mm:ssZ.
Object definitions
Name · Address · Location · OperatingInfo · OperatingHours · SpecialHours · Media · Photo · Ratings · Review · User · Award · Ranking · Relationships · Attribute · ServiceLists · EVChargingPort · EVConnector · MonetaryValue · ActionUrls · Description
Name object
Represents a business name in a specific locale.
| Field | Type | Requirement | Description |
|---|---|---|---|
| name | string | Required | The business name. Must be at least one character. |
| locale | string | Optional | Locale code in BCP-47 format (for example, en-US, ja-JP). Regular expression pattern: ^[a-z]{2}-[A-Z]{2}$ |
| nameInKana | string | Optional | Phonetic Kana pronunciation. Use for Japanese-language POIs. |
Address object
Represents a physical address for a POI.
| Field | Type | Requirement | Description |
|---|---|---|---|
| addressLine1 | string | Required | Primary street address (for example, "123 Main St"). |
| city | string | Required | City name. |
| postalCode | string | Required | Postal or ZIP code. |
| countryCode | string | Required | ISO 3166-1 alpha-2 two-letter country code (for example, US, DE). Regular expression pattern: ^[A-Z]{2}$ |
| stateOrRegion | string | Required* | State, province, or region. See the conditional rule for stateOrRegion. |
| addressLine2 | string | Optional | Secondary address line (for example, suite, floor, unit). |
| addressLine3 | string | Optional | Additional address line. |
| districtOrCounty | string | Optional | District or county name. |
| neighborhood | string | Optional | Neighborhood name. |
| crossStreets | string | Optional | Intersecting street names (for example, "Corner of 1st Ave & Pike St"). |
Conditional rule for stateOrRegion
stateOrRegion is required for all countries except France (FR), Spain (ES), and Great Britain (GB). For those three countries, stateOrRegion is optional.
Location object
Geographic coordinate data for the POI.
| Field | Type | Requirement | Description |
|---|---|---|---|
| displayPosition | string | Optional | Coordinates for map display. Format: geo:[lat],[lon] (for example, geo:47.5951,-122.3326). If not provided, Alexa+ uses navigationPosition as the display position. |
| navigationPosition | string | Recommended | Coordinates for navigation/routing. Same format as displayPosition. |
| bbox | string | Optional | Bounding box coordinates representing the POI's geographic footprint. |
displayPosition and navigationPosition may differ. For example, a large shopping mall may display a pin at the main entrance but route drivers to a specific parking entrance. If you omit displayPosition, Alexa+ automatically uses navigationPosition as the display position.OperatingInfo object
Describes the hours of operation and closure status for a POI.
| Field | Type | Requirement | Description |
|---|---|---|---|
| hours | array of OperatingHours | Optional | Regular weekly operating hours. |
| specialHours | array of SpecialHours | Optional | Hours for holidays or special dates. These override regular hours for the specified dates. |
| pickupHours | array of OperatingHours | Optional | Hours specifically for curbside/in-store pickup. |
| deliveryHours | array of OperatingHours | Optional | Hours specifically for delivery service. |
| isClosed | boolean | Optional | Set to true if the POI is permanently closed. |
| temporarilyClosedUntil | string (date) | Optional | Date through which the POI is temporarily closed. Format: yyyy-MM-dd. |
isClosed is true, it indicates a permanent closure. For temporary closures, use temporarilyClosedUntil instead.OperatingHours object
Represents operating hours for a single day of the week.
| Field | Type | Requirement | Description |
|---|---|---|---|
| day | string enum | Required | Day of the week. One of: SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY |
| isOpen | boolean | Optional | Whether the business is open on this day. Set to false for days the business is closed. |
| open | string | Optional | Opening time. Format: HH:mm:ss (24-hour clock, for example, 09:00:00). |
| close | string | Optional | Closing time. Format: HH:mm:ss (24-hour clock, for example, 22:00:00). |
close to 23:59:59 for that day. Add a separate entry for the next day with open set to 00:00:00 and close set to the actual closing time (for example, 02:00:00).SpecialHours object
Represents operating hours for a specific date (for example, a public holiday or special event).
| Field | Type | Requirement | Description |
|---|---|---|---|
| date | string (date) | Required | The specific date. Format: yyyy-MM-dd. |
| isOpen | boolean | Required | Whether the business is open on this date. |
| open | string | Optional | Opening time. Format: HH:mm:ss (24-hour). Include this field if isOpen is true. |
| close | string | Optional | Closing time. Format: HH:mm:ss (24-hour). Include this field if isOpen is true. |
| open24 | boolean | Optional | Set to true if the business is open 24 hours on this date. |
Media object
Container for business photos and imagery.
| Field | Type | Requirement | Description |
|---|---|---|---|
| primaryPhotoUrl | string (URL) | Optional | URL of the primary or featured photo for the business. |
| photos | array of Photo | Optional | Additional photos of the business. |
Photo object
Represents a single photo or image.
| Field | Type | Requirement | Description |
|---|---|---|---|
| url | string (URL) | Required | Direct URL to the photo. Must begin with http:// or https://. |
| caption | string | Optional | Descriptive caption for the photo. |
| slideshowUrl | string (URL) | Optional | URL to a slideshow version of the image. |
| id | string | Optional | Unique identifier for the photo. |
Ratings object
Aggregated ratings, reviews, awards, and ranking information for the POI.
| Field | Type | Requirement | Description |
|---|---|---|---|
| rating | number | Optional | Aggregate user rating. Scale: 0.0 to 10.0. |
| reviewCount | integer | Optional | Total number of user reviews. Must be ≥ 0. |
| reviews | array of Review | Optional | Individual user reviews. |
| awards | object | Optional | Awards keyed by award program name. Each value is an array of Award objects. |
| ranking | Ranking object | Optional | Curated ranking information (for example, "#4 of 13 restaurants in Seattle"). |
Review object
Represents a single customer review.
| Field | Type | Requirement | Description |
|---|---|---|---|
| text | string | Required | The review text body. |
| id | string | Optional | Unique identifier for the review. |
| rating | integer | Optional | Reviewer's rating. Scale: 0 to 10. |
| language | string | Optional | Language code for the review text (for example, en, ja, de). |
| created | string (date-time) | Optional | Date and time the review was created. Format: ISO 8601. |
| url | string (URL) | Optional | Link to the full review on the provider's site. |
| user | User object | Optional | Information about the review author. |
User object
Represents a reviewer.
| Field | Type | Requirement | Description |
|---|---|---|---|
| id | string | Required | Unique identifier for the user. |
| name | string | Required | Display name of the user. |
| photoUrl | string (URL) | Optional | URL to the user's profile photo. |
Award object
Represents an award or recognition received by the POI.
| Field | Type | Requirement | Description |
|---|---|---|---|
| awardType | string | Optional | Category or type of award (for example, "Michelin Star"). |
| awardYear | string | Optional | Year the award was received (for example, "2025"). |
| awardName | string | Optional | Full name of the award. |
| awardSmallImage | string (URL) | Optional | URL to a small badge or logo image for the award. |
| awardLargeImage | string (URL) | Optional | URL to a large badge or logo image for the award. |
Ranking object
Represents curated ranking information for the POI.
| Field | Type | Requirement | Description |
|---|---|---|---|
| ranking | string | Optional | Human-readable ranking string (for example, "#4 of 13"). |
| rankingPosition | string | Optional | Numeric position in the ranking. |
| rankingDenominator | string | Optional | Total number of POIs in the ranking group. |
| rankingCategory | string | Optional | The category the POI is ranked within (for example, "Italian Restaurants"). |
| rankingGeo | string | Optional | Geographic location context for the ranking (for example, "Seattle, WA"). |
| rankingGeoId | string | Optional | Identifier for the ranking geography. |
Relationships object
Defines how a POI relates to other POIs or business entities.
| Field | Type | Requirement | Description |
|---|---|---|---|
| chainIds | array of string | Optional | Identifiers for any chains this POI belongs to (for example, a franchise chain ID). |
| group | string | Optional | The broader business group this POI is affiliated with. |
| containedBy | string | Optional | The id of a parent POI that physically contains this POI (for example, a restaurant inside a shopping mall). |
| contains | array of string | Optional | Array of ids of POIs that are physically contained within this POI. |
Attribute object
Detailed characteristics of the POI. All sub-fields are objects with string key-value pairs unless otherwise noted.
| Field | Type | Requirement | Description |
|---|---|---|---|
| knownFor | string | Optional | A short phrase describing what the business is best known for. |
| popularDishes | array of string | Optional | List of popular menu items (for food service POIs). |
| cuisine | object | Optional | Free-form key-value pairs describing cuisine type(s) offered (for example, {"primary": "Italian"}). |
| menu | object | Optional | Free-form key-value pairs describing menu and dietary options (for example, {"vegetarian": "true", "glutenFree": "available"}). |
| alcohol | object | Optional | Free-form key-value pairs describing alcohol service details (for example, {"served": "Full Bar", "byo": "No"}). |
| attire | object | Optional | Free-form key-value pairs describing dress code (for example, {"required": "Smart Casual"}). |
| goodFor | object | Optional | Free-form key-value pairs describing suitable-for designations (for example, {"kids": "true", "groups": "true"}). |
| capacity | object | Optional | Free-form key-value pairs describing seating or capacity information (for example, {"seats": "120"}). |
| amenities | object | Optional | Free-form key-value pairs describing available amenities (for example, {"wifi": "Free", "outdoorSeating": "true"}). |
| access | object | Optional | Free-form key-value pairs describing access restrictions (for example, {"wheelchairAccessible": "true"}). |
| parking | object | Optional | Free-form key-value pairs describing parking details (for example, {"type": "Street", "free": "true"}). |
| payment | object | Optional | Free-form key-value pairs describing accepted payment methods (for example, {"creditCard": "true", "cash": "true"}). |
| services | ServiceLists object | Optional | Structured service data (currently supports EV charging ports). |
| charging | object | Optional | EV charging summary attributes. Use services.chargingPorts for detailed port data. |
| events | object | Optional | Free-form key-value pairs describing events hosted at the POI. |
| hospital | object | Optional | Hospital-specific attributes (for healthcare POIs). |
| general | object | Optional | General business attributes not covered by other fields. |
| open24 | object | Optional | 24-hour operation indicators keyed by day or service type. |
ServiceLists object
For EV charging station POIs, use attributes.services.chargingPorts to provide detailed port-level data.
| Field | Type | Requirement | Description |
|---|---|---|---|
| chargingPorts | array of EVChargingPort | Optional | Individual EV charging port details. |
EVChargingPort object
Represents a single EV charging port.
| Field | Type | Requirement | Description |
|---|---|---|---|
| portId | string | Required | Unique identifier for this port. |
| ocpiIds | array of string | Optional | OCPI (Open Charge Point Interface) standard IDs for this port. |
| network | string | Optional | Charging network name (for example, "ChargePoint", "Tesla", "EVgo"). |
| name | string | Optional | Display name for this port. |
| costPerKwh | MonetaryValue | Optional | Cost per kilowatt-hour of energy delivered. |
| costPerMin | MonetaryValue | Optional | Cost per minute of charging time. |
| costPerUse | MonetaryValue | Optional | Flat fee per charging session. |
| free | boolean | Optional | Set to true if charging is provided at no cost. |
| chargingLevels | array of string | Optional | Charging levels available at this port (for example, ["LEVEL_2"], ["DC_FAST"]). |
| connectorTypes | array of string | Optional | Connector type codes supported (for example, ["J_1772", "CHADEMO"]). |
| connectors | array of EVConnector | Optional | Detailed connector-level data. |
EVConnector object
Represents a specific charging connector.
| Field | Type | Requirement | Description |
|---|---|---|---|
| connectorId | string | Required | Unique identifier for this connector. |
| ocpiId | string | Optional | OCPI standard ID for this connector. |
| connectorType | string | Optional | Connector type (for example, J_1772, CHADEMO, TESLA, CCS). |
| chargingLevel | string | Optional | Power delivery level: LEVEL_1, LEVEL_2, LEVEL_3, or DC_FAST. |
| volts | string | Optional | Voltage specification (for example, "240"). |
| kilowatts | string | Optional | Power output in kilowatts (for example, "7.2"). |
| amps | string | Optional | Amperage (for example, "32"). |
MonetaryValue object
Represents a monetary amount with currency.
| Field | Type | Requirement | Description |
|---|---|---|---|
| currencyCode | string | Required | ISO 4217 3-letter currency code (for example, USD, EUR, GBP). Regular expression pattern: ^[A-Z]{3}$ |
| value | string | Required | Decimal string representing the amount in the major currency unit. Regular expression pattern: ^[+-]?[0-9]*(\.[0-9]+)?$ |
value is a string, not a number, to preserve decimal precision. For example, use "1.50" not 1.5.ActionUrls object
Deep-link URLs that users can use to initiate task-completion actions.
| Field | Type | Requirement | Description |
|---|---|---|---|
| providerUrl | string (URL) | Optional | The data provider's listing page for this POI. |
| bookingUrl | string (URL) | Optional | Direct URL for reservations or appointment booking. |
| orderFoodUrl | string (URL) | Optional | Direct URL for online food ordering or delivery. |
| covidVaccineBookingUrl | string (URL) | Optional | URL for COVID-19 vaccine appointment booking. |
Description object
A locale-specific text description of the business.
| Field | Type | Requirement | Description |
|---|---|---|---|
| description | string | Required | The description text. Must be at least one character. |
| locale | string | Optional | BCP-47 locale code (for example, en-US). Regular expression pattern: ^[a-z]{2}-[A-Z]{2}$ |
Format and validation rules
Date and time formats
| Type | Format | Example |
|---|---|---|
| Date-time (ISO 8601) | yyyy-MM-ddTHH:mm:ssZ |
2026-03-15T08:30:00Z |
| Date only | yyyy-MM-dd |
2026-12-25 |
| Time only | HH:mm:ss (24-hour) |
09:00:00, 22:30:00 |
Coordinate format
Geographic coordinates must use the geo: URI scheme:
geo:[latitude],[longitude]
- Latitude: -90.0 to 90.0
- Longitude: -180.0 to 180.0
Valid examples:
-
geo:47.5951,-122.3326 -
geo:-33.8688,151.2093
Invalid examples:
-
47.5951,-122.3326(missinggeo:prefix) -
geo:47.5951, -122.3326(space not allowed)
URL format
All URL fields must:
- Begin with
http://orhttps:// - Contain no spaces
Locale codes
Regular expression pattern: ^[a-z]{2}-[A-Z]{2}$
| Valid | Invalid |
|---|---|
en-US |
EN-US (uppercase language) |
ja-JP |
en_US (underscore separator) |
de-DE |
eng-US (3-letter language code) |
Country codes
Regular expression pattern: ^[A-Z]{2}$ — two uppercase letters.
| Valid | Invalid |
|---|---|
US |
us (lowercase) |
GB |
GBR (3-letter code) |
DE |
Germany (full name) |
Currency codes
Regular expression pattern: ^[A-Z]{3}$ — three uppercase letters.
| Valid | Invalid |
|---|---|
USD |
usd |
EUR |
US$ |
JPY |
Dollar |
Monetary value
The value field in MonetaryValue objects must be a decimal string.
| Valid | Invalid |
|---|---|
"1.50" |
1.50 (must be a string) |
"45.00" |
"$45.00" (no currency symbol) |
"0.35" |
"free" (must be numeric) |
Sample JSON data
The following is a complete sample POI record demonstrating all key fields:
FAQs
The following FAQs cover common questions about the POI data schema.
- Q: When is
stateOrRegionrequired? -
stateOrRegionis required for all countries except France (FR), Spain (ES), and Great Britain (GB). For all other countries, such as the United States, Canada, Germany, Japan, and Australia, you must include a value forstateOrRegion. - Q: My business doesn't have fixed hours. What should I submit?
-
If hours vary significantly or are unavailable, omit the
operatingInfo.hoursarray entirely. Don't submit placeholder or estimated hours. If the business has no set hours but is always open, set each day's entry with"isOpen": true,"open": "00:00:00", and"close": "23:59:59". - Q: What happens if I don't provide
locationcoordinates? -
Alexa+ attempts to geocode the
addressto derive coordinates. However, geocoded coordinates may be less precise than Global Positioning System (GPS)-accurate coordinates. This is particularly true for businesses in dense urban areas, large campuses, or malls. Amazon strongly recommends that you providelocation.navigationPositionfor all records. If you omitdisplayPosition, Alexa+ automatically usesnavigationPositionas the display position. - Q: Can a POI have multiple addresses?
-
Yes. The
addressfield is an array that accepts multiple entries to support locale-specific translations of the same physical address. For example, a Japanese POI can include the same address in both English and Japanese locales. Don't use this array to submit different physical addresses. - Q: Should I include
alexaSupportedActions? -
Yes. For enabling booking or appointments, set this to
["BOOKING"]. For enabling food ordering, set this to["DELIVERY"]. If you support both, set it to["BOOKING", "DELIVERY"]. - Q: How should I handle permanently closed POIs?
-
Set
operatingInfo.isClosedtotrue. Don't delete the record from your feed immediately. Alexa+ needs the record to process the closure and suppress the POI from results. You may remove the record from future feeds after confirming the closure has been processed. - Q: How should I handle temporarily closed POIs?
-
Use
operatingInfo.temporarilyClosedUntilwith the last date that the POI is closed inyyyy-MM-ddformat. Don't setisClosedtotruefor temporary closures, as that signals a permanent closure. - Q: The
ratingfield goes to 10 but most services use a 5-star scale. Should I convert? -
Yes, normalize your ratings to the 0–10 scale before submission. For example, submit a 4.25 out of 5 rating as
8.5. - Q: Are there any fields I shouldn't include if I don't have data?
-
Yes, omit fields for which you have no data rather than submitting empty strings or
nullvalues. The schema usesadditionalProperties: false, which means any unexpected fields or improperly typed values cause validation failures. - Q: What's the
idfield used for? -
The
idis the stable, unique key for this POI across all submissions. Alexa+ uses it to match incoming updates to existing POI records, deduplicate submissions, and manage deletions. If you need to merge two records, contact your Alexa+ Solutions Architect team.
Related topics
Last updated: Jul 10, 2026

