Location action link details validation rules for link configuration and parameter requirements
Quicklinks
ActionLinkDetailsNestedQuicklinksMustNotBeEmptyArray
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinks is not an empty array |
Example Validation Report
{
"code": "VALIDATION__ActionLinkDetailsNestedQuicklinksMustNotBeEmptyArray",
"message": "'{{field}}' must be omitted or contain at least one element; empty arrays are not allowed.",
"severity": "VIOLATION",
"context": {
"field": "quicklinks"
},
"details": {
"compared": [],
"expected": [],
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks",
"value": "[]"
}
],
"createdDate": "2026-03-03T13:58:43.946Z"
}
}
CountOfItemsInQuicklinksListExceedsThreshold
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that the count of items in quicklinks does not exceed two hundred fifty-six (256) |
Example Validation Report
{
"code": "VALIDATION__CountOfItemsInQuicklinksListExceedsThreshold",
"severity": "VIOLATION",
"message": "List of `quicklinks` exceeds limit"
}
QuicklinksListMustNotIncludeNulls
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that a list does not include null |
QuicklinksListMustNotContainDuplicates
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that each entry in the quicklinks list is distinct |
Example Validation Report
{
"code": "VALIDATION__QuicklinksListMustNotContainDuplicates",
"severity": "VIOLATION",
"message": "`quicklinks` list must not contain duplicates"
}
LocationMustNotHaveQuicklinks
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that a location's category is allowed to be associated with quicklinks |
Example Validation Report
{
"code": "VALIDATION__LocationMustNotHaveQuicklinks",
"severity": "VIOLATION",
"message": "Location with category '{{value}}' cannot have `quicklinks`",
"context": {
"value": "natural_features.water_feature.pool"
},
"details": {
"createdDate": "2026-09-02T11:36:02.000Z",
"submitted": [
{
"field": "$.locationDetails.categories[0]",
"value": "natural_features.water_feature.pool"
}
],
"compared": [],
"expected": []
}
}
App Store URL
AppStoreUrlMustBePresent
| Preconditions |
|---|
relationship is OTHER |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that appStoreUrl is present | Link |
Example Validation Report
{
"code": "VALIDATION__AppStoreUrlMustBePresent",
"severity": "VIOLATION",
"message": "Field '{{field}}' must be present",
"context": {
"field": "appStoreUrl"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0]"
}
],
"compared": [],
"expected": []
}
}
AppStoreUrlMustHaveExpectedAuthority
| Preconditions |
|---|
appStoreUrl value is present |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that the appStoreUrl authority is apps.apple.com |
Example Validation Report
{
"code": "VALIDATION__AppStoreUrlMustHaveExpectedAuthority",
"severity": "VIOLATION",
"message": "'{{value}}' in field 'appStoreUrl' does not include expected authority. Valid value is 'apps.apple.com''",
"context": {
"value": "https://play.google.com/store/search?q=yelp&c=apps"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].appStoreUrl",
"value": "https://play.google.com/store/search?q=yelp&c=apps"
}
],
"compared": [],
"expected": []
}
}
AppStoreUrlsMustMatchWhenRelationshipIsOwner
| Preconditions |
|---|
More than one (1) OWNER relationship is present |
appStoreUrl values are present (quicklinks are not flexible action links) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that appStoreUrl values match among Quicklinks whose relationship is OWNER |
Example Validation Report
{
"code": "VALIDATION__AppStoreUrlsMustMatchWhenRelationshipIsOwner",
"severity": "VIOLATION",
"message": "Non-matching values in field '{{field}}' among owned Quicklinks",
"context": {
"field": "appStoreUrl"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].appStoreUrl[0]"
}
],
"compared": [],
"expected": []
}
}
AppStoreUrlMustNotBeEmpty
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that appStoreUrl is not an empty string |
Example Validation Report
{
"code": "VALIDATION__AppStoreUrlMustNotBeEmpty",
"severity": "VIOLATION",
"message": "Field '{{field}}' is empty",
"context": {
"field": "appStoreUrl"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].appStoreUrl"
}
],
"compared": [],
"expected": []
}
}
AppStoreUrlMustNotMatchQuicklinkUrl
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that appStoreUrl and quicklinkUrl values do not match |
Example Validation Report
{
"code": "VALIDATION__AppStoreUrlMustNotMatchQuicklinkUrl",
"severity": "VIOLATION",
"message": "'appStoreUrl' and 'quicklinkUrl' values must not match"
}
Category
CategoryMayHaveOneAuthorizedAndOneOwnerRelationship
| Preconditions |
|---|
More than one (1) instance of the same category is present |
appStoreUrl values are present (quicklinks are not flexible action links) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that only (1) of the Quicklink's respective relationship values is AUTHORIZED and only one (1) is OWNER | Link |
Example Validation Report
{
"code": "VALIDATION__CategoryMayHaveOneAuthorizedAndOneOwnerRelationship",
"severity": "VIOLATION",
"message": "Only one (1) `AUTHORIZED` and only one `OWNER` Quicklink may exist when 'category' value '{{value}}' are same",
"context": {
"value": "quicklinks.restaurant_order_food"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].category",
"value": "quicklinks.restaurant_order_food"
}
],
"compared": [],
"expected": []
}
}
CategoryMayBeAssociatedWithAppStoreUrlExactlyOnce
| Preconditions |
|---|
appStoreUrl is present (quicklink is not flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that a category of quicklink references an appStoreUrl exactly once (1) | Link |
Example Validation Report
{
"code": "VALIDATION__CategoryMayBeAssociatedWithAppStoreUrlExactlyOnce",
"severity": "VIOLATION",
"message": "Quicklink Category '{{value}}' references the same `appStoreUrl` more than once",
"context": {
"field": "category",
"value": "quicklinks.restaurant_order_food"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].appStoreUrl",
"value": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350"
},
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].appStoreUrl",
"value": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350"
}
],
"compared": [],
"expected": []
}
}
CategoryOfFlexibleActionLinkMayHaveOneOwnerRelationship
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
orgId resolves to organization that is location owner |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that each category is distinct |
Example Validation Report
{
"code": "VALIDATION__CategoryOfFlexibleActionLinkMayHaveOneOwnerRelationship",
"severity": "VIOLATION",
"message": "Multiple `OWNER` quicklinks have matching category '{{category}}'",
"context": {
"category": "quicklinks.restaurant_order_food"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].category",
"value": "quicklinks.restaurant_order_food"
}
],
"compared": [],
"expected": []
}
}
CategoryMustBePresent
| Preconditions |
|---|
quicklinks are present |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that category is present | Link |
Example Validation Report
{
"code": "VALIDATION__CategoryMustBePresent",
"severity": "VIOLATION",
"message": "Field '{{field}}' must be present",
"context": {
"field": "category"
}
}
CategoryMustNotBeEmpty
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that category is not an empty string |
Example Validation Report
{
"code": "VALIDATION__CategoryMustNotBeEmpty",
"severity": "VIOLATION",
"message": "Field '{{field}}' is empty",
"context": {
"field": "category"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].category"
}
],
"compared": [],
"expected": []
}
}
CategoryMustBeValid
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that category value is valid | Link |
Example Validation Report
{
"code": "VALIDATION__CategoryMustBeValid",
"severity": "VIOLATION",
"message": "'category' value '{{value}}' is invalid",
"context": {
"value": "foo_bar"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].category",
"value": "foo_bar"
}
],
"compared": [],
"expected": []
}
}
CategoryMustBeValidForUseWithPrimaryCategory
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that category value is valid for use in conjunction with the location's primary category | Link,Link |
Example Validation Report
{
"code": "VALIDATION__CategoryMustBeValidForUseWithPrimaryCategory",
"severity": "VIOLATION",
"message": "'category' value '{{value}}' is not valid for use with location's primary category",
"context": {
"value": "MENU"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].category",
"value": "MENU"
}
],
"compared": [
{
"field": "$.locationDetails.categories[0]/",
"value": "ev_fast_charging_station"
}
],
"expected": []
}
}
Flexible Action Link
FlexibleActionLinkRelationshipMustBeOwner
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
orgId resolves to organization that is location owner |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that relationship value is OWNER | Link |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkRelationshipMustBeOwner",
"severity": "VIOLATION",
"message": "A organization that owns the location may only submit 'OWNER' flexible action link",
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].relationship",
"value": "AUTHORIZED"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkRelationshipMustBeAuthorized
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
orgId resolves to organization that is an authorized (AGENCY) partner |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that relationship value is AUTHORIZED | Link |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkRelationshipMustBeAuthorized",
"severity": "VIOLATION",
"message": "An agency may only submit an 'AUTHORIZED' flexible action link",
"details": {
"createdDate": "2026-10-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].relationship",
"value": "OWNER"
}
],
"compared": [],
"expected": []
}
}
OnlyLocationOwnerOrAuthorizedAgencyMaySubmitFlexibleActionLink
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that orgId resolves to organization that is location owner or authorized agency |
Example Validation Report
{
"code": "VALIDATION__OnlyLocationOwnerOrAuthorizedAgencyMaySubmitFlexibleActionLink",
"severity": "VIOLATION",
"message": "Only location owner or trusted agency may submit a flexible action link",
"details": {
"createdDate": "2026-10-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[2]"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkIsMalformed
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that flexible action link quicklinkUrl has expected variables |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkIsMalformed",
"severity": "VIOLATION",
"message": "Flexible action link '{{value}}' in 'quicklinkUrl' is malformed",
"context": {
"value": "http://www.exam ple.com"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "http://www.exam ple.com"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkIsNotParsable
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that flexible action link quicklinkUrl is parsable |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkIsNotParsable",
"message": "Flexible action link '{{value}}' in 'quicklinkUrl' is not parsable",
"severity": "VIOLATION",
"context": {
"value": "httpsexamplecom/page"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "httpsexamplecom/page"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkProtocolIsNotSupported
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that the flexible action link quicklinkUrl url protocol is https |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkProtocolIsNotSupported",
"message": "Protocol for flexible action link '{{value}}' in 'quicklinkUrl' must be `https`",
"severity": "VIOLATION",
"context": {
"value": "ftp://public.ftp-servers.example.com/mydirectory/myfile.txt"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "ftp://public.ftp-servers.example.com/mydirectory/myfile.txt"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkPortNumberIsNotSupported
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that the port number is in the range 1 to 65535 |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkPortNumberIsNotSupported",
"message": "Port number for '{{value}}' in 'quicklinkUrl' must be in range 1 to 65535",
"severity": "VIOLATION",
"context": {
"value": "https://example.com/page"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example.com/page"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkDomainOrAddressIsNotSupported
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that the hostname is an FQDN, or IPv4 or IPv6 address |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkDomainOrAddressIsNotSupported",
"message": "Hostname for '{{value}}' in 'quicklinkUrl' must be FQDN, or IPv4 or IPv6 address",
"severity": "VIOLATION",
"context": {
"value": "https://example_page.com"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example_page.com"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkFQDNHostnameIsNotResolvable
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that an FQDN hostname is resolvable |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkFQDNHostnameIsNotResolvable",
"message": "FQDN hostname is not resolvable for '{{value}}' in 'quicklinkUrl'",
"severity": "VIOLATION",
"context": {
"value": "https://example_page.com"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example_page.com"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkIPAddressIsNotSupported
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that the resolved IP or the IP within the hostname is supported |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkIPAddressIsNotSupported",
"message": "IP Address is not supported for '{{value}}' in 'quicklinkUrl'",
"severity": "VIOLATION",
"context": {
"value": "https://example_page.com"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example_page.com"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkContentExceedsMaxFileSize
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that content byte size does not exceed threshold |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkContentExceedsMaxFileSize",
"message": "Content for '{{value}}' in 'quicklinkUrl' exceeds maximum allowed size",
"severity": "VIOLATION",
"context": {
"value": "https://example.com/page"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example.com/page"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkContentNotDownloadedSuccessfully
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that content is downloaded successfully and that content byte size does not exceed threshold |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkContentNotDownloadedSuccessfully",
"message": "Content for '{{value}}' in 'quicklinkUrl' could not be downloaded. Or, downloaded content exceeds maximum allowed size",
"severity": "VIOLATION",
"context": {
"value": "https://example.com/page"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example.com/page"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkContentMimeTypeNotSupported
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that MIME type is valid and supported |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkContentMimeTypeNotSupported",
"message": "Content MIME type for '{{value}}' in 'quicklinkUrl' is invalid or unsupported",
"severity": "VIOLATION",
"context": {
"value": "https://example.com/page"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example.com/page"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkContentMimeTypeDiscrepancy
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that content's detected MIME type matches the expected MIME type |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkContentMimeTypeDiscrepancy",
"message": "Detected MIME type for '{{value}}' in 'quicklinkUrl' does not match expected MIME type",
"severity": "VIOLATION",
"context": {
"value": "https://example.com/page"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example.com/page"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkContentFailedVirusScan
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that content passes a virus scan check |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkContentFailedVirusScan",
"message": "Content for '{{value}}' in 'quicklinkUrl' failed virus scan",
"severity": "VIOLATION",
"context": {
"value": "https://example.com/page"
},
"details": {
"createdDate": "2026-02-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://example.com/page"
}
],
"compared": [],
"expected": []
}
}
Quicklink URL
DifferentAuthorizedQuicklinksWithNonDistinctQuicklinkUrls
| Preconditions |
|---|
More than one (1) AUTHORIZED relationship is present |
Among AUTHORIZED Quicklinks, appStoreUrl values are distinct |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl values are distinct |
Example Validation Report
{
"code": "VALIDATION__DifferentAuthorizedQuicklinksWithNonDistinctQuicklinkUrls",
"severity": "VIOLATION",
"message": "Field 'quicklinkUrl' value '{{value}}' matches another `AUTHORIZED` provider with different `appStoreUrl`",
"context": {
"value": "https://www.dai-due.com/menu/"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "https://www.dai-due.com/menu/"
}
],
"compared": [],
"expected": []
}
}
QuicklinkUrlsMatch
| Preconditions |
|---|
More than one (1) instance of the same category is present |
At least one quicklink has no appStoreUrl (quicklink is flexible action link) |
At least one quicklink has an appStoreUrl (quicklink is not a flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that a flexible action link's quicklinkUrl does not match any quicklinkUrl possessed by a quicklink with an appStoreUrl | Link |
Example Validation Report
{
"code": "VALIDATION__QuicklinkUrlsMatch",
"severity": "VIOLATION",
"message": "Flexible action link 'quicklinkUrl' value '{{value}}' matches quicklink with an 'appStoreUrl'",
"context": {
"value": "https://www.dai-due.com/menu/"
},
"details": {
"createdDate": "2026-05-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://www.dai-due.com/menu/"
},
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "https://www.dai-due.com/menu/"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkQuicklinkUrlsMatch
| Preconditions |
|---|
Action link category values are dissimilar |
Action links being compared have no appStoreUrl (quicklinks are flexible action links) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl values do not match |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkQuicklinkUrlsMatch",
"severity": "WARNING",
"message": "Flexible action links with dissimilar category share the same 'quicklinkUrl' value '{{value}}'",
"context": {
"value": "https://www.austin-theater.com/shows"
},
"details": {
"createdDate": "2026-10-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0]",
"value": {
"category": "quicklinks.theater_now_playing",
"quicklinkUrl": "https://www.austin-theater.com/shows",
"relationship": "AUTHORIZED"
}
},
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1]",
"value": {
"category": "quicklinks.buy_tickets",
"quicklinkUrl": "https://www.austin-theater.com/shows",
"relationship": "AUTHORIZED"
}
}
],
"compared": [],
"expected": []
}
}
OwnerProvidedQuicklinksWithNonDistinctQuicklinkUrls
| Preconditions |
|---|
More than one (1) OWNER relationship is present |
Among OWNER Quicklinks, appStoreUrl values match |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl values are distinct |
Example Validation Report
{
"code": "VALIDATION__OwnerProvidedQuicklinksWithNonDistinctQuicklinkUrls",
"severity": "VIOLATION",
"message": "Field 'quicklinkUrl' value '{{value}}' matches another `AUTHORIZED` provider with different `appStoreUrl`",
"context": {
"value": "https://www.dai-due.com/menu/"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "https://www.dai-due.com/menu/"
}
],
"compared": [],
"expected": []
}
}
QuicklinkUrlMustBePresent
| Preconditions |
|---|
quicklinks are present |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl is present | Link |
Example Validation Report
{
"code": "VALIDATION__QuicklinkUrlMustBePresent",
"severity": "VIOLATION",
"message": "Field '{{field}}' must be present",
"context": {
"field": "quicklinkUrl"
}
}
QuicklinkUrlLengthMustNotExceedMaximum
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl length does not exceed a maximum value (255) | Link |
Example Validation Report
{
"code": "VALIDATION__QuicklinkUrlLengthMustNotExceedMaximum",
"severity": "WARNING",
"message": "'{{field}}' length must not be exceeded",
"context": {
"field": "quicklinkUrl"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "http://exampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexample.com"
}
],
"compared": [],
"expected": []
}
}
QuicklinkUrlMatchesHomePageUrl
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl does not exactly match the HOMEPAGE url in urls |
Example Validation Report
{
"code": "VALIDATION__QuicklinkUrlMatchesHomePageURL",
"severity": "WARNING",
"message": "'{{field}}' matches HOMEPAGE url",
"context": {
"field": "quicklinkUrl"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "https://www.daidue.com"
}
],
"compared": [],
"expected": []
}
}
QuicklinkUrlMustNotBeEmpty
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl is not an empty string |
Example Validation Report
{
"code": "VALIDATION__QuicklinkUrlMustNotBeEmpty",
"severity": "VIOLATION",
"message": "Field '{{field}}' is empty",
"context": {
"field": "quicklinkUrl"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl"
}
],
"compared": [],
"expected": []
}
}
QuicklinkUrlMustNotBeAppStoreUrl
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl is not an App Store URL |
Example Validation Report
{
"code": "VALIDATION__QuicklinkUrlMustNotBeAppStoreUrl",
"severity": "VIOLATION",
"message": "'{{value}}' in `quicklinkUrl` is App Store URL",
"context": {
"value": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].quicklinkUrl",
"value": "https://apps.apple.com/us/app/yelp-food-delivery-reviews/id284910350"
}
],
"compared": [],
"expected": []
}
}
QuicklinkUrlMustHaveValidFormat
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl has valid formatting |
Relationship
RelationshipMustBePresent
| Preconditions |
|---|
quicklinks are present |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that relationship is present | Link |
Example Validation Report
{
"code": "VALIDATION__RelationshipMustBePresent",
"severity": "VIOLATION",
"message": "Field '{{field}}' must be present",
"context": {
"field": "relationship"
}
}
RelationshipMustNotBeEmpty
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that relationship is not an empty string |
Example Validation Report
{
"code": "VALIDATION__RelationshipMustNotBeEmpty",
"severity": "VIOLATION",
"message": "Field '{{field}}' is empty",
"context": {
"field": "relationship"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].relationship"
}
],
"compared": [],
"expected": []
}
}
RelationshipMustBeValid
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that relationship value is valid | Link |
Example Validation Report
{
"code": "VALIDATION__RelationshipMustBeValid",
"severity": "VIOLATION",
"message": "'{{value}}' in 'relationship' is invalid. Valid values are 'OWNER', 'AUTHORIZED', or 'OTHER'",
"context": {
"value": "CUSTOMER"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].relationship"
}
],
"compared": [],
"expected": []
}
}
Security
AppStoreUrlMustPassUrlScan
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that appStoreUrl passes security checks |
QuickLinkUrlMustPassUrlScan
| Preconditions |
|---|
quicklinks object does not describe a flexible action link |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that quicklinkUrl passes security checks |
{{reason}} |
|---|
malformed |
not parsable |
only http or https schemes accepted |
port not within expected range |
hostname is neither FQDN, IP v4 nor IP v6 |
does not resolve to accepted IP address version (v4 or v6) |
does not resolve to accepted IP address |
file size exceeds maximum |
failed to download |
unrecognizable MIME type |
unexpected content for MIME type |
failed virus scan |
note
Validation report may be delivered synchronously or asynchronously, depending upon the mode of execution of the specific check
Example Validation Report
{
"code": "VALIDATION__QuickLinkUrlMustPassUrlScan",
"message": "QuickLinkUrl rejected for reason: '{{reason}}'",
"severity": "VIOLATION",
"context": {
"reason": "only http or https schemes accepted"
},
"details": {
"createdDate": "2026-09-01T21:00:00.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "ftp://www.dai-due.com/menu/"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkAuthorityNotMatchedInLocationUrls
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
Location urls lists HOMEPAGE |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Validate that an authority in a flexible action link's quicklinkUrl matches the authority of the location's HOMEPAGE |
Example Validation Report
{
"code": "VALIDATION__QuicklinkUrlAuthorityNotMatchedInLocationUrls",
"severity": "INFO",
"message": "Authority in '{{value}}' in field 'quicklinkUrl' does not match `HOMEPAGE` authority in location's 'urls'",
"context": {
"field": "quicklinkUrl"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "https://www.unmatched-authority.com/menu/"
}
],
"compared": [],
"expected": []
}
}
FlexibleActionLinkOnDenyList
| Preconditions |
|---|
appStoreUrl is not present (quicklink is flexible action link) |
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
| Validate that a 'quicklinkUrl' value or its redirect URL is not on a deny list |
Example Validation Report
{
"code": "VALIDATION__FlexibleActionLinkOnDenyList",
"severity": "VIOLATION",
"message": "Flexible action link's 'quicklinkUrl' or '{{redirectUrl}}' is on deny list",
"context": {
"redirectUrl": "https://www.redirect-url-on-deny-list.com"
},
"details": {
"createdDate": "2026-02-10T11:36:02.00Z",
"submitted": [
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[1].quicklinkUrl",
"value": "https://www.website-on-deny-list.com"
}
],
"compared": [],
"expected": []
}
}
URL Re-scan
LocationUrlRejected
| Definition | Severity | API | Sample | Mode |
|---|---|---|---|---|
Periodically, (re)validate that a quicklinkUrl, or its redirect URL, passes security checks |
note
{{reason}} may be populated by the message value that's associated with the manual verification of a flexible action link
Example Validation Report
{
"validationReports": [
{
"code": "VALIDATION__LocationUrlRejected",
"message": "Location `quicklinkUrl` rejected: '{{reason}}'",
"severity": "VIOLATION",
"context": {
"reason": "Flexible action link does not correspond to Location."
},
"details": {
"createdDate": "2026-04-10T11:36:02.00Z",
"submitted": [
{
"field": "$.id",
"value": "1851286158726660114"
},
{
"field": "$.etag",
"value": "ca59b316-ddcd-11ec-97ed-2bc3ad80a69c"
},
{
"field": "$.locationDetails.actionLinkDetails.quicklinks[0].",
"value": "https://example.com/irrelevant-flexible-action-link-on-location"
}
]
}
}
]
}
Process Flow
- System fetches the
quicklinkUrl - System validates the URL or its redirect ("value")
- If one or more automated checks reject the value, then Subflow A
- If value is not in the allow list, then Manual Verification is triggered:
- If value is in the allow list, then Subflow B
Subflow A
- System captures Feedback and Notification
- Periodically API user requests Notifications
Subflow B
- Publish change
- Re-run conflation
note
Partner location etag is unchanged. No feedback or notification is generated