Access Points
AccessPointsCoordinatesMustBeWithinValidRange
The valid range is -90 to 90 for latitude and -180 to 180 for longitude. Latitude value 91.358834 is not within the valid range.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"accessPoints": [
{
"coordinates": {
"latitude": "91.358834",
"longitude": "4.893834"
},
"source": "MANUALLY_PLACED",
"navigation": "DRIVING"
}
]
}
AccessPointsCoordinatesMustBeSufficientlyPrecise
Latitude value 51.3588 has a precision of four (4) decimal places.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"accessPoints": [
{
"coordinates": {
"latitude": "51.3588",
"longitude": "4.893834"
},
"source": "MANUALLY_PLACED",
"navigation": "DRIVING"
}
]
}
AccessPointsLatLongMustNotBeZero
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"accessPoints": [
{
"coordinates": {
"latitude": "0.358835",
"longitude": "0.893834"
},
"source": "MANUALLY_PLACED",
"navigation": "DRIVING"
}
]
}
Action Link Details
AppStoreUrlMustHaveExpectedAuthority
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://play.google.com/store/search?q=yelp&c=apps",
"relationship": "AUTHORIZED"
}
]
}
}
AppStoreUrlsMustMatchWhenRelationshipIsOwner
More than one (1) Quicklink's relationship is an OWNER. Respective appStoreUrl values do not match. Given that a quicklink relationship describes the nature of the association between the app and a location, it is suspicious that there are different applications available in the App Store, supporting different quicklinks, for the same location.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_delivery",
"quicklinkUrl": "https://www.yelp.com/order/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/uber-eats-food-delivery/id1058959277",
"relationship": "OWNER"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "OWNER"
}
]
}
}
CategoryMayHaveOneAuthorizedAndOneOwnerRelationship
Scenario One
More than one (1) instance of the same category is present but only a single Quicklink is AUTHORIZED
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.grubhub.com/menu/dai-due-austin",
"appStoreUrl": "https://apps.apple.com/us/app/grubhub-food-delivery/id302920553",
"relationship": "OTHER"
}
]
}
}
Scenario Two
More than one (1) instance of the same category. Neither Quicklink is AUTHORIZED or OWNER.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "OTHER"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.grubhub.com/menu/dai-due-austin",
"appStoreUrl": "https://apps.apple.com/us/app/grubhub-food-delivery/id302920553",
"relationship": "OTHER"
}
]
}
}
Scenario Three
More than one (1) instance of the same category is present and more than one Quicklink is AUTHORIZED
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.grubhub.com/menu/dai-due-austin",
"appStoreUrl": "https://apps.apple.com/us/app/grubhub-food-delivery/id302920553",
"relationship": "AUTHORIZED"
}
]
}
}
Scenario Four
More than one (1) instance of the same category is present and one Quicklink is AUTHORIZED and the other is OWNER
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.dai-due.com/menu/",
"appStoreUrl": "https://apps.apple.com/us/app/dai-due-austin/id302920990",
"relationship": "OWNER"
}
]
}
}
AppStoreUrlMustNotMatchQuicklinkUrl
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"relationship": "AUTHORIZED"
}
]
}
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
}
]
}
}
CategoryMayBeAssociatedWithAppStoreUrlExactlyOnce
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/order/falafel_house/new_brunswick",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.falafel_house/new_brunswick",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "OTHER"
}
]
}
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/order/falafel_house/new_brunswick",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.falafel_house/new_brunswick",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
}
]
}
}
DifferentAuthorizedQuicklinksWithNonDistinctQuicklinkUrls
More than one AUTHORIZED provider is present possessing a distinct appStoreUrl. Their respective quicklinkUrl values are not distinct.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
},
{
"category": "quicklinks.restaurant_order_takeout",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/grubhub-food-delivery/id302920553",
"relationship": "AUTHORIZED"
}
]
}
}
QuicklinkUrlsMatch
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.dai-due.com/menu/",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "OWNER"
},
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.dai-due.com/menu/",
"relationship": "OWNER"
}
]
}
}
OwnerProvidedQuicklinksWithNonDistinctQuicklinkUrls
More than one OWNER provided Quicklink is present possessing the same appStoreUrl. Their respective quicklinkUrl values are not distinct.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.dai-due.com/menu/",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "OWNER"
},
{
"category": "quicklinks.restaurant_order_takeout",
"quicklinkUrl": "https://www.dai-due.com/menu/",
"appStoreUrl": "https://apps.apple.com/us/app/dai-due-austin/id302920990",
"relationship": "OWNER"
}
]
}
}
QuicklinksListMustNotIncludeNulls
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [ null ]
}
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [ { null } ]
}
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"actionLinkDetails": {
"quicklinks": [
{
"category": "quicklinks.restaurant_order_food",
"quicklinkUrl": "https://www.yelp.com/menu/dai-due-austin-5",
"appStoreUrl": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350",
"relationship": "AUTHORIZED"
},
{ null }
]
}
}
Location Attributes
LocationAttributesNameMustBeDistinct
Provided name values are not distinct.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"locationAttributes": [
{
"name": "crossbusiness.services.delivery",
"value": "true"
},
{
"name": "crossbusiness.services.delivery",
"value": "false"
}
]
}
Location Status
OnlyClosedDateMustBePresent
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"locationStatus": {
"status": "CLOSED",
"closedDate": "2026-03-23",
"reopenDate": "2026-03-23"
}
}
Categories
CategoriesMustBeDistinct
Duplicate (non-distinct) category values.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ "shopping.food_mart.convenience_store", "shopping.food_mart.convenience_store" ]
}
CategoryMustBePrecise
Scenario One
Only a parent node is provided. A parent is also referred to as a Level 0 value or a first dot delimited (".") value.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ "shopping" ]
}
Scenario Two
A parent node and a more precise category value is provided. The parent node is imprecise and also redundant in this scenario.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ "shopping", "shopping.store.beauty_supply_store.cosmetics_store" ]
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"categories": [ "shopping.store.beauty_supply_store.cosmetics_store" ]
}
ListShouldExcludeRedundantCategory
shopping.food_mart.grocery_store is redundant. Value is already present in shopping.food_mart.grocery_store.discount_grocery_store
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ "shopping.food_mart.grocery_store", "shopping.food_mart.grocery_store.discount_grocery_store" ]
}
TopLevelCategoryChanged
In the latest submission the top level category, also referred to as the first dot delimited (".") value, is shopping.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ "shopping.food_mart", "dining.bakery.donut_shop", "dining.bakery.pastry_shop" ]
}
When each first dot delimited value in the latest submission is compared to all first period delimited values in the stored record, shopping is not detected.
"categories": [ "dining.bakery.donut_shop", "dining.bakery.pastry_shop" ]
TopLevelCategoryUnmatched
In the latest submission the top level category, also referred to as the first period delimited (".") value, is shopping.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ "shopping.food_mart" ]
}
When the first period delimited value in the latest submission is compared to all first period delimited values in the stored record, no match is detected.
"categories": [ "dining.bakery.donut_shop", "dining.bakery.pastry_shop" ]
Display Names
DisplayNamesIncludesNounSynonymousWithOperations
name includes Headquarters.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Headquarters Beercade",
"locale": "en",
"primary": true
}
]
}
DisplayNamesLocaleMustBeDistinct
Scenario One
Non-matching display names possess matching locale values.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en-US",
"primary": true
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en-US",
"primary": false
},
{
"name": "Ice Cream & Custard",
"locale": "en-US",
"primary": false
}
]
}
Scenario Two
Non-matching display names.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en-US",
"primary": true
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en",
"primary": false
},
{
"name": "Ice Cream & Custard",
"locale": "en",
"primary": false
}
]
}
Scenario Three
Matching display names possessing the matching locale values.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en-US",
"primary": true
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en-US",
"primary": false
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en-US",
"primary": false
}
]
}
Scenario Four
Matching display names possessing matching locale values.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en-US",
"primary": true
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en",
"primary": false
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en",
"primary": false
}
]
}
Scenario Five
Matching display names possessing dissimilar locale values. en is not considered to be a duplicate of en-US. The data is interpreted to mean that the (US) English version should be targeted at readers of content in the US. Whereas, in all other places in the world where English is spoken (GB, Australia, New Zealand, etc) the alternative should be presented. The fact that the name values themselves match is not the concern of this validation.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en-US",
"primary": true
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en-US",
"primary": false
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en",
"primary": false
}
]
}
DisplayNamesLocaleMustNotBeEmpty
locale is empty string.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Headquarters Beercade",
"locale": "",
"primary": true
}
]
}
DisplayNamesNameMustNotBeDummyCharacters
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Test",
"locale": "en",
"primary": true
}
]
}
DisplayNamesLocaleNotMatchedByKeywordsOtherLocale
Scenario One
locale is en
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location - Display Names
{
"displayNames": [
{
"name": "Headquarters Beercade",
"locale": "en",
"primary": true
}
]
}
Display Names listed locale is not matched in Location Keywords listed locale
Location - Keywords
{
"locationKeywords": {
"other": [
{
"keyword": "Service de blanchisserie",
"locale": "fr"
}
]
}
}
Scenario Two
locale is "en"
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location - Display Names
{
"displayNames": [
{
"name": "Headquarters Beercade",
"locale": "en",
"primary": true
}
]
}
Display Names listed locale matches the primary language tag in Location Keywords listed locale
Location - Keywords
{
"locationKeywords": {
"other": [
{
"keyword": "Laundry Service",
"locale": "en-US"
}
]
}
}
DisplayNamesPrimaryFlagMustBePresent
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en-US",
"primary": true
}
]
}
Scenario Two
Single display name is flagged primary.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en",
"primary": true
},
{
"name": "Malibu Ice Cream & Custard",
"locale": "en",
"primary": false
},
{
"name": "Ice Cream & Custard",
"locale": "en-US",
"primary": false
}
]
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Malibu Ice Cream",
"locale": "en",
"primary": true
},
{
"name": "glace et crème pâtissière",
"locale": "fr"
}
]
}
DisplayNamesNameHasSuspectedNounSynonymousWithOperations
name is Headquarters
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Headquarters",
"locale": "en",
"primary": true
}
]
}
DisplayNamesHasSuspectedPresenceOfDummyCharacters
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Test Location Record",
"locale": "en",
"primary": true
}
]
}
DisplayNamesNameHasSuspectedUnintentionalSequentialWordRepetition
name includes &&
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"displayNames": [
{
"name": "Mark's && Spencer's",
"locale": "en",
"primary": true
}
]
}
LocationPrimaryDisplayNamesNameNotMatchedWithBrandName
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Where primary display names share the same en primary language tag, names match.
Location
{
"locationDetails": {
"displayNames": [
{
"name": "Truluck's",
"locale": "en",
"primary": true
}
]
}
}
Brand
{
"brandDetails": {
"displayNames": [
{
"name": "Truluck's",
"locale": "en-US",
"primary": true
}
]
}
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Where primary display names share the same en primary language tag, names do not match.
Location
{
"locationDetails": {
"displayNames": [
{
"name": "Eddie V's - Austin",
"locale": "en",
"primary": true
}
]
}
}
Brand
{
"brandDetails": {
"displayNames": [
{
"name": "Eddie V's Prime Seafood",
"locale": "en",
"primary": true
}
]
}
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
- Where primary display names share the same
es primary language tag, names match.
en language tag is not listed on the brand. The location primary display name with this language tag is not considered by this validation.
Location
{
"locationDetails": {
"displayNames": [
{
"name": "Eddie V's Prime Seafood",
"locale": "es",
"primary": true
},
{
"name": "Eddie V's - Austin",
"locale": "en",
"primary": true
}
]
}
}
Brand
{
"brandDetails": {
"displayNames": [
{
"name": "Eddie V's Prime Seafood",
"locale": "es",
"primary": true
}
]
}
}
Scenario Four
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"locationDetails": {
"displayNames": [
{
"name": "中国银行",
"locale": "zh",
"primary": true
},
{
"name": "Bank of China",
"locale": "en",
"primary": true
}
]
}
}
Brand
{
"brandDetails": {
"displayNames": [
{
"name": "中国银行",
"locale": "zh",
"primary": true
},
{
"name": "Bank of China",
"locale": "en",
"primary": true
}
]
}
}
Scenario Five
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
- Similar to scenario three,
en language tag is not listed on the brand. The primary display name with this language tag is not considered by this validation.
Location
{
"locationDetails": {
"displayNames": [
{
"name": "Pikelotes",
"locale": "es",
"primary": true
},
{
"name": "RaNdOmLeTtErSaNdNuMbErS",
"locale": "en",
"primary": true
}
]
}
}
Brand
{
"brandDetails": {
"displayNames": [
{
"name": "Pikelotes",
"locale": "es",
"primary": true
}
]
}
}
Scenario Six
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
- Where primary display names share the same
zh primary language tag, names match.
- Brand's
en language tag is not listed on the location. The absence of this language tag on the location is not considered by this validation.
Location
{
"locationDetails": {
"displayNames": [
{
"name": "中国银行",
"locale": "zh",
"primary": true
}
]
}
}
Brand
{
"brandDetails": {
"displayNames": [
{
"name": "中国银行",
"locale": "zh",
"primary": true
},
{
"name": "Bank of China",
"locale": "en",
"primary": true
}
]
}
}
Scenario Seven
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"locationDetails": {
"displayNames": [
{
"name": "Au Bon Pain",
"locale": "en",
"primary": true
}
]
}
}
Brand
{
"brandDetails": {
"displayNames": [
{
"name": "Pret A Manger",
"locale": "fr",
"primary": true
}
]
}
}
Keywords
KeywordsOtherKeywordMustNotBeDummyCharacters
First listed keyword has dummy characters.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"locationKeywords": {
"other": [
{
"keyword": "test",
"locale": "en"
},
{
"keyword": "Wash & Fold",
"locale": "en"
}
]
}
}
KeywordsProductsKeywordHasSuspectedUnintentionalSequentialWordRepetition
Second listed keyword includes unintentional sequential characters.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"locationKeywords": {
"services": [
{
"keyword": "Laundry Service",
"locale": "en"
},
{
"keyword": "Wash & & Fold",
"locale": "en"
}
]
}
}
KeywordsServices_ExpectedLangTagForCountryNotPresent
Scenario: Location's countryCode is NL (Netherlands). The expectation is that certain features with descriptive information would have at least one (1) language tag that is equal to nl.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"mainAddress": {
"fullAddress": "Den Texstraat 16, Amsterdam, 1017 ZA, NL",
"structuredAddress": {
"thoroughfare": "Den Texstraat",
"subThoroughfare": "16",
"fullThoroughfare": "Den Texstraat 16",
"locality": "Amsterdam",
"administrativeArea": "North Holland",
"countryCode": "NL",
"postCode": "1017 ZA"
},
"locale": "en"
}
}
All listed entries have a language tag of "en".
Location - Keywords
{
"locationKeywords": {
"services": [
{
"keyword": "Laundry Service",
"locale": "en"
},
{
"keyword": "Wash & Fold",
"locale": "en"
}
]
}
}
KeywordServiceHasSuspectedPresenceOfDummyCharacters
First listed keyword includes dummy characters.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"locationKeywords": {
"services": [
{
"keyword": "A test case",
"locale": "en"
},
{
"keyword": "Wash & Fold",
"locale": "en"
}
]
}
}
KeywordsServiceKeywordMustNotBeEmpty
First listed keyword is empty.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"locationKeywords": {
"services": [
{
"keyword": "",
"locale": "en"
},
{
"keyword": "Wash & Fold",
"locale": "en"
}
]
}
}
KeywordValueDuplicatedAcrossLists
Laundry Service is duplicated.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"locationKeywords": {
"services": [
{
"keyword": "Laundry Service",
"locale": "en"
},
{
"keyword": "Wash & Fold",
"locale": "en"
}
],
"other": [
{
"keyword": "Laundry Service",
"locale": "en"
}
]
}
}
Multi-property
ListMustNotContainNulls
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ { null } ]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ null ]
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"categories": [ "dining.bar.darts_bar", null, "dining.bar.dive_bar" ]
}
Opening Hours by Day
HoursAreWithin06:00To11:00Range
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "07:00",
"endTime": "10:30"
}
]
}
]
}
MajorityOfHoursNotWithin08:00To20:00Range
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "17:00",
"endTime": "02:00"
}
]
}
]
}
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "10:00"
}
]
}
]
}
OpeningHoursDaysTimesMustNotMatch
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "12:00"
},
{
"startTime": "10:00",
"endTime": "12:00"
}
]
}
]
}
OpeningHoursDaysTimesMustNotOverlap
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "12:30"
},
{
"startTime": "12:00",
"endTime": "17:00"
}
]
}
]
}
SuspiciouslyShortClosureBetweenTimesInDay
Scenario One
Zero time interval between listed times
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "12:00"
},
{
"startTime": "12:00",
"endTime": "17:00"
}
]
}
]
}
Scenario Two
Fifteen minute interval between listed times
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "12:00"
},
{
"startTime": "12:15",
"endTime": "17:00"
}
]
}
]
}
SuspiciousWeekdayTimeVariance
Scenario One
THURSDAY variance from the observed norm among other days is suspicious
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
},
{
"day": "WEDNESDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
},
{
"day": "THURSDAY",
"times": [
{
"startTime": "10:00",
"endTime": "13:00"
}
]
},
{
"day": "FRIDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
}
]
}
SuspiciousWeekendRestriction
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "SATURDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
}
]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "SATURDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
},
{
"day": "SUNDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
}
]
}
OpeningHoursByDayListMustNotIncludeNulls
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [ { null } ]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [ null ]
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"openingHoursByDay": []
}
OpeningHoursByDayTimesListMustNotIncludeNulls
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [{ null }]
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "10:00",
"endTime": "22:00"
}
]
}
]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": [ null ]
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "10:00",
"endTime": "22:00"
}
]
}
]
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"openingHoursByDay": [
{
"day": "MONDAY",
"times": []
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "10:00",
"endTime": "22:00"
}
]
}
]
}
Phone Numbers
AtLeastOnePrimaryPhoneNumberShouldBePresent
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false
}
]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false
},
{
"phoneNumber": "+18000000000",
"type": "TOLL_FREE",
"primary": false
}
]
}
MustOnlyHaveOnePrimaryPhoneNumber
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": true
},
{
"phoneNumber": "+18000000000",
"type": "TOLL_FREE",
"primary": true
}
]
}
PhoneNumbersDescriptions_ExpectedLangTagForCountryNotPresent
Location's countryCode is NL (Netherlands). The expectation is that certain features with descriptive information would have at least one (1) language tag that is equal to nl.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location - Main Address
{
"mainAddress": {
"fullAddress": "Den Texstraat 16, Amsterdam, 1017 ZA, NL",
"structuredAddress": {
"thoroughfare": "Den Texstraat",
"subThoroughfare": "16",
"fullThoroughfare": "Den Texstraat 16",
"locality": "Amsterdam",
"administrativeArea": "North Holland",
"countryCode": "NL",
"postCode": "1017 ZA"
},
"locale": "en"
}
}
Listed entry has "en" primary language tag.
Location - Phone Numbers
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false,
"descriptions": [
{
"text": "Main phone number to call for all inquiries",
"locale": "en"
}
]
}
]
}
PhoneNumbersDescriptionsLocaleMustBeDistinct
Scenario One
One listed entry has en primary language tag but is indistinguishable from the entry with en-US.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false,
"descriptions": [
{
"text": "Main phone number to call for all inquiries",
"locale": "en-US"
},
{
"text": "Main phone number to call for all enquiries",
"locale": "en"
}
]
}
]
}
Scenario Two
All listed entries have en primary language tag
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false,
"descriptions": [
{
"text": "Main phone number to call for all inquiries",
"locale": "en"
},
{
"text": "Main number for all inquiries",
"locale": "en"
}
]
}
]
}
Scenario Three
All listed entries have en primary language tag and region subtags are distinct.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false,
"descriptions": [
{
"text": "Main phone number to call for all inquiries",
"locale": "en-US"
},
{
"text": "Main phone number to call for all enquiries",
"locale": "en-GB"
}
]
}
]
}
PhoneNumbersDescriptionsTextMustNotBeDummyCharacters
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false,
"descriptions": [
{
"text": "Test",
"locale": "en"
}
]
}
]
}
PhoneNumbersDescriptionsTextMustNotBeEmpty
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": false,
"descriptions": [
{
"text": "",
"locale": "en"
}
]
}
]
}
PhoneNumberTypeMustBeDistinct
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"phoneNumbers": [
{
"phoneNumber": "+12225551212",
"type": "LANDLINE",
"primary": true
},
{
"phoneNumber": "+18000000000",
"type": "LANDLINE",
"primary": false
}
]
}
Service Hours
ServiceHoursDaysTimesMustNotMatch
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"serviceHours": [
{
"category": "servicehours.retail.pharmacy_hours",
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "10:00"
},
{
"startTime": "10:00",
"endTime": "10:00"
}
]
}
]
}
]
}
ServiceHoursDaysTimesMustNotOverlap
First listed entry's endTime ("12:30") overlaps second listed entry's startTime ("12:00") by 30 minutes.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"serviceHours": [
{
"category": "servicehours.retail.pharmacy_hours",
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "12:30"
},
{
"startTime": "12:00",
"endTime": "18:00"
}
]
}
]
}
]
}
ServiceHoursHoursByDayDayMustBeDistinct
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"serviceHours": [
{
"category": "servicehours.retail.pharmacy_hours",
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "12:30"
}
]
},
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "12:30"
}
]
}
]
}
]
}
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"serviceHours": [
{
"category": "servicehours.retail.pharmacy_hours",
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "10:00"
}
]
}
]
}
]
}
TopLevelServiceHourCategoryChanged
In the latest submission the top level category is retail.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"serviceHours": [
{
"category": "servicehours.retail.photoshop_hours",
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "17:00"
}
]
}
]
}
]
}
When the first period delimited value in the latest submission is compared to the first period delimited values in the stored record, retail is not detected.
"categories": "servicehours.retail.pharmacy_hours"
Special Hours
DateInRangeHasNoCorrespondingDaySpecified
Scenario One
Each calendar date derived from the specified startDate and endDate range corresponds with a day listed in hoursByDay.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "TUESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "WEDNESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "THURSDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "FRIDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "SATURDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "SUNDAY",
"times": [
{
"startTime": "09:00",
"endTime": "14:00"
}
]
}
],
"startDate": "2026-12-22",
"endDate": "2026-12-27",
"closed": false,
"descriptions": [
{
"text": "Hours during week of Christmas",
"locale": "en-GB"
}
]
}
]
}
Scenario Two
The startDate corresponds with a Tuesday on the calendar. "TUESDAY" is not listed in hoursByDay.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "WEDNESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "THURSDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "FRIDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "SATURDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "SUNDAY",
"times": [
{
"startTime": "09:00",
"endTime": "14:00"
}
]
}
],
"startDate": "2026-12-22",
"endDate": "2026-12-27",
"closed": false,
"descriptions": [
{
"text": "Hours during week of Christmas",
"locale": "en-GB"
}
]
}
]
}
SpecialHoursDateRangeExceedsNinetyDays
Scenario One
Quantity of days in date range 2026-12-24 to 2026-12-24 exceeds ninety (90) days.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "FRIDAY",
"times": [
{
"startTime": "09:00",
"endTime": "12:00"
}
]
}
],
"startDate": "2026-12-24",
"endDate": "2026-12-24",
"closed": "false",
"descriptions": [
{
"text": "Early Closing Christmas Eve",
"locale": "en-US"
}
]
}
]
}
Scenario Two
Quantity of days derived from startDate and endDate for the second (1) Special Hours listing is greater than 90 days.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "SUNDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "MONDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "WEDNESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "THURSDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "FRIDAY",
"times": [
{
"startTime": "09:00",
"endTime": "14:00"
}
]
}
],
"startDate": "2026-12-18",
"endDate": "2026-12-24",
"closed": false,
"descriptions": [
{
"text": "Hours during week of Christmas",
"locale": "en-GB"
}
]
},
{
"startDate": "2026-12-25",
"endDate": "2026-12-25",
"closed": true,
"descriptions": [
{
"text": "Closed Christmas Day",
"locale": "en-GB"
}
]
}
]
}
SpecialHoursDatesMustNotOverlap
Scenario One
Special Hours listings overlap on 2026-12-25. Dates are inclusive
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "FRIDAY",
"times": [
{
"startTime": "09:00",
"endTime": "12:00"
}
]
}
],
"startDate": "2026-12-24",
"endDate": "2026-12-25",
"closed": "false",
"descriptions": [
{
"text": "Early Closing Christmas Eve",
"locale": "en-US"
}
]
},
{
"startDate": "2026-12-25",
"endDate": "2026-12-25",
"closed": "true",
"descriptions": [
{
"text": "Closed Christmas Day",
"locale": "en-US"
}
]
}
]
}
Scenario Two
Corrected version of Special Hours from scenario one
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "FRIDAY",
"times": [
{
"startTime": "09:00",
"endTime": "12:00"
}
]
}
],
"startDate": "2026-12-24",
"endDate": "2026-12-24",
"closed": "false",
"descriptions": [
{
"text": "Early Closing Christmas Eve",
"locale": "en-US"
}
]
},
{
"startDate": "2026-12-25",
"endDate": "2026-12-25",
"closed": "true",
"descriptions": [
{
"text": "Closed Christmas Day",
"locale": "en-US"
}
]
}
]
}
Scenario Three
Special Hours listings overlap on 2026-12-20
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "SUNDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "MONDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
}
],
"startDate": "2026-12-18",
"endDate": "2026-12-20",
"closed": false,
"descriptions": [
{
"text": "Hours at beginning of Christmas week",
"locale": "en-GB"
}
]
},
{
"hoursByDay": [
{
"day": "WEDNESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "THURSDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "FRIDAY",
"times": [
{
"startTime": "09:00",
"endTime": "14:00"
}
]
}
],
"startDate": "2026-12-20",
"endDate": "2026-12-24",
"closed": false,
"descriptions": [
{
"text": "Hours during 3 days before Christmas",
"locale": "en-GB"
}
]
},
{
"startDate": "2026-12-25",
"endDate": "2026-12-25",
"closed": true,
"descriptions": [
{
"text": "Closed Christmas Day",
"locale": "en-GB"
}
]
}
]
}
SpecifiedDayMustCoincideWithDateInRange
Scenario One
FRIDAY is not coincident with any date in date range 2026-12-24 to 2026-12-24.
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "FRIDAY",
"times": [
{
"startTime": "09:00",
"endTime": "12:00"
}
]
}
],
"startDate": "2026-12-24",
"endDate": "2026-12-24",
"closed": "false",
"descriptions": [
{
"text": "Early Closing Christmas Eve",
"locale": "en-US"
}
]
}
]
}
Scenario Two
MONDAY is not coincident with any date in date range
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "WEDNESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "THURSDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
}
],
"startDate": "2026-12-25",
"endDate": "2026-12-27",
"closed": false
}
]
}
Scenario Three
Each day is coincident with a date in the date range. The date range includes calendar days not specified. However, their absence is not the concern of this validation.
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "TUESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "WEDNESDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
},
{
"day": "THURSDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
}
],
"startDate": "2026-12-28",
"endDate": "2026-12-31",
"closed": false
}
]
}
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "10:00",
"endTime": "10:00"
}
]
}
],
"startDate": "2026-10-14",
"endDate": "2026-10-14",
"closed": false
}
]
}
HoursByDayMustNotBePresentWhenClosed
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [],
"startDate": "2026-12-26",
"endDate": "2026-12-26",
"closed": true,
"descriptions": [
{
"text": "Closed on Boxing Day",
"locale": "en-GB"
}
]
}
]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"specialHours": [
{
"hoursByDay": [
{
"day": "MONDAY",
"times": [
{
"startTime": "08:00",
"endTime": "18:00"
}
]
}
],
"startDate": "2026-12-26",
"endDate": "2026-12-26",
"closed": true,
"descriptions": [
{
"text": "Closed on Boxing Day",
"locale": "en-GB"
}
]
}
]
}
URLs
UrlsListMustNotContainNulls
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"urls": [
{
"url": "http://example.com",
"type": "HOMEPAGE"
},
{ null }
]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
UrlsUrlMustIncludeAppStoreId
Scenario One
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"urls": [
{
"url": "https://www.provider.com/us/app/location-name-app",
"type": "IOS_APP"
}
]
}
Scenario Two
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"urls": [
{
"url": "https://www.provider.com/us/app/location-name-app/id",
"type": "IOS_APP"
}
]
}
Scenario Three
| Pass Scenario | Failure Scenario |
|---|
| ✓ | |
Sample Input
Location
{
"urls": [
{
"url": "https://www.provider.com/us/app/location-name-app/id123456789",
"type": "IOS_APP"
}
]
}
UrlsMustBeDistinct
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"urls": [
{
"url": "http://example.com",
"type": "HOMEPAGE"
},
{
"url": "http://example.com",
"type": "YELP"
}
]
}
UrlShouldHaveExpectedAuthority
Expected authority for the URL is facebook.com
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"urls": [
{
"url": "http://example.com/my_page",
"type": "FACEBOOK"
}
]
}
UrlsAppStoreUrlMustHaveExpectedAuthority
| Pass Scenario | Failure Scenario |
|---|
| ✓ |
Sample Input
Location
{
"urls": [
{
"url": "https://play.google.com/store/search?q=yelp&c=apps",
"type": "IOS_APP"
}
]
}