<br />

## Overview

The **Inventory Viewer** in Actions Center provides visibility into the
ingestion health, place matching status, and serving eligibility of your Point
of Interest (POI) local inventory.

This viewer displays issues independent of individual ingestions---stateful issues
representing the active serving status of each service provider incorporating
any possible failure modes (policy, warnings, errors, etc.) that may occur.

Use this tool to:

- Search and inspect all ingested service providers and their live serving states.
- Diagnose data validation errors and content policy violations.
- Submit and track appeals for any policy violations.
- Inspect service provider matching diagnostics and submit manual match proposals.
- Review raw JSON payloads from your latest feed ingestions.

## Inventory Table Columns

The list view displays all uploaded service providers from your Point of
Interest (POI) feed, organized hierarchically by entity. You can filter by Local
POI ID, Matching Status, Integration, and Surface.

| Summary Table Columns | Description |
|---|---|
| **Local POI ID** | The unique identifier for the local property provided in the feed (`poi_id`). |
| **Local POI Name** | The localized name of the local property extracted from the feed. |
| **Matching Status** | Indicates whether the POI has been matched to a Google Maps listing: • **Yes** (Green badge): Successfully matched to a Google Maps place. • **No** (Red badge): Unmatched; requires review or a match proposal. |
| **Integration** | This is the Local Aggregator Unit integration. |
| **Surface** | The target serving surface (e.g. Search). |
| **Serving Status** | The real-time serving eligibility state: • **Enabled** (Green indicator): Eligible and actively servable on Google surfaces. • **Disabled** (Red indicator): Blocked from serving due to validation errors, policy violations, or unmatched status. |
| **Errors** | Count of active issues with a severity of Error. The existence of any error for a property means that property won't be eligible to serve on any surface. |
| **Warnings** | Count of active issues with a severity of Warning. Properties with warnings are still eligible to serve. |
| **Match Info** | Contains the Edit match button, which opens the interactive match fix panel. |

> [!NOTE]
> **Note:** Data propagation through the ingestion pipeline typically takes an average of 24--48 hours. Newly ingested or updated POIs may take a longer period to reflect full match and serving statuses.

## POI Details View

Clicking any **POI ID** in the list view navigates to the entity's dedicated
details page.

The details view consists of four expandable sections:

### 1. Basic Info

Summarizes high-level entity metadata:

- **POI Name** : Name of the establishment as parsed from `data[].name.localizations`.
- **POI ID** : Unique partner entity identifier (`poi_id`).
- **Data source**: The exact feed filename from which this entity was ingested.

### 2. Serving Status

Breaks down serving eligibility per integration and target surface:

- **Integration \& Surface** : Vertical and target surface (e.g., `Local
  Aggregator Unit` on `Search`).
- **Serving Status** : Current `Enabled` or `Disabled` status.
- **Issues** : Displays issue badges for all active errors or warnings (e.g., `Unmatched entity`, `Policy Violation`). Clicking an issue badge opens the **Issue Details Panel**.
- **Appeals** : Displays override or appeal states (`Under review`, `Approved`, or `Rejected`).

### 3. Matching Information

Displays place matching diagnostics:

- **Match input** : The formatted physical address parsed from your feed (`street_address`, `locality`, `region`, `postal_code`, `country`).
- **Match type** : The matching resolution mechanism (e.g. `Location`).
- **Match namespace** : The vertical your match changes will apply to (e.g. `Local Aggregator Unit`).
- **Match status** : `Yes` (Green) or `No` (Red).
- **Match output**: The resolved Google Maps place name, address, and place ID.
- **Edit match**: Button to open the match proposal dialog.

### 4. Raw JSON

Provides an interactive code viewer with line numbers and syntax highlighting
displaying the full parsed JSON payload (`item_proto`) for rapid schema
debugging and verification. The data values presented here will reflect the
values received from the POI feed.

## Issues \& Triage Workflow

Entities flagged with issues are either **disabled** (if flagged with an
**ERROR** ) or **degraded** (if flagged with a **WARNING**). Entity issues with a
warning are not appealable, and warnings can be resolved by fixing the
underlying issue.

### Issue Types: Appealable versus Non-Appealable

1. **Non-Appealable Issues (Technical, Data Quality, \& Warning Validations):**
   - Caused by schema errors, missing required fields, invalid coordinates, broken URLs, duplicate IDs, or non-blocking content warnings (such as non-default locale business names, or any locales for descriptions, display addresses, and establishment categories).
   - **Resolution:** Partners must correct the underlying data in their source feed and upload an updated feed file.
2. **Appealable Issues (Blocking Content \& Policy Violations):**
   - Triggered when required property text or image assets fail automated content safety filters with an ERROR severity.
   - **Resolution:** If the content complies with the platform policies, partners can click the **Appeal** button next to the issue in Actions Center to submit an appeal. Partners must provide a reason and justification, and our appeals team will review and approve or deny the requests. You'll be notified using the tool and email on decisions made.

## Local Aggregator Unit Issue Catalog

The following table outlines the complete set of validation errors and policy
issue codes for Local Aggregator Unit integrations:

| Issue Description | Severity | Issue Code | Affected Field / Args | Is it Appealable? | Action / Relevant Policy |
|---|---|---|---|---|---|
| **Missing POI ID** | **ERROR** | `MISSING_REQUIRED_FIELD` | `poi_id` | **No** | Provide a unique `poi_id`. See [POI Feed Specification](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#feed_specifications). |
| **Missing default locale for "name" field** | **ERROR** | `MISSING_REQUIRED_FIELD` | `name.default_locale` | **No** | Specify a valid BCP 47 language code for the default locale. See [Multilingual Support](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#multi-lingual_support). |
| **No default localization found for "name" field** | **ERROR** | `MISSING_REQUIRED_FIELD` | `name.localizations` | **No** | Provide a value for the localized name of the POI matching the declared `default_locale` language. |
| **Missing default locale for "description" field** | **ERROR** | `MISSING_REQUIRED_FIELD` | `description.default_locale` | **No** | Specify a valid BCP 47 default locale for the property description. |
| **No default localization found for "description" field** | **ERROR** | `MISSING_REQUIRED_FIELD` | `description.localizations` | **No** | Provide description text matching the declared `default_locale` language. |
| **Missing default locale for "display_address" field** | **ERROR** | `MISSING_REQUIRED_FIELD` | `display_address.default_locale` | **No** | Specify a valid BCP 47 default locale for the display address. |
| **No default localization found for "display_address" field** | **ERROR** | `MISSING_REQUIRED_FIELD` | `display_address.localizations` | **No** | Provide formatted address text matching the declared `default_locale` language. |
| **Exceeded maximum image count** | **WARNING** | `EXCEEDED_MAX_COUNT` | `images` | **No** | Limit image entries to a maximum of 5 images per POI. Excess images are dropped. |
| **Invalid latitude coordinate** | **ERROR** | `INVALID_LATLNG` | `location.latitude` | **No** | Enter a valid latitude between `-90.0` and `+90.0`. See [Geo-coordinates Definition](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#GeoCoordinates-definition). |
| **Invalid longitude coordinate** | **ERROR** | `INVALID_LATLNG` | `location.longitude` | **No** | Enter a valid longitude between `-180.0` and `+180.0`. See [Geo-coordinates Definition](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#GeoCoordinates-definition). |
| **Missing latitude coordinate** | **ERROR** | `MISSING_REQUIRED_FIELD` | `location.latitude` | **No** | Provide the latitude value to complete the coordinate pair. See [Geo-coordinates Definition](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#GeoCoordinates-definition). |
| **Missing longitude coordinate** | **ERROR** | `MISSING_REQUIRED_FIELD` | `location.longitude` | **No** | Provide the longitude value to complete the coordinate pair. See [Geo-coordinates Definition](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#GeoCoordinates-definition). |
| **Missing or unstructured address** | **ERROR** | `MISSING_REQUIRED_FIELD` | `location.address` | **No** | Provide a structured postal address including street, locality, postal code, and country. |
| **Malformed or invalid URL** | **ERROR** | `INVALID_ATTRIBUTE_VALUE` | `url` | **No** | Ensure the landing page URL uses a supported HTTP/HTTPS protocol and valid syntax. |
| **Invalid or unreachable image** | **WARNING** | `INVALID_IMAGE` | `image.url` | **No** | Verify that image URLs are publicly reachable and don't require authentication or return 4xx/5xx errors. |
| **Duplicate POI ID** | **ERROR** | `DUPLICATE_ENTITY` | `poi_id` | **No** | Ensure each `poi_id` is unique across the feed payload. Remove duplicate entries. |
| **Duplicate matched entity** | **ERROR** | `DUPLICATE_MATCHED_ENTITY` | `POI` | **No** | Remove duplicate entries from your feed, or use the [POI Entity Matching](https://developers.google.com/actions-center/verticals/local_vss/partner-portal/inventory/poi-entity-matching) tool to match distinct businesses to their independent Google Maps listings. |
| **Unmatched entity** | **ERROR** | `UNMATCHED_ENTITY` | `POI` | **No** | Match the POI to a Google Maps place listing using the [POI Entity Matching](https://developers.google.com/actions-center/verticals/local_vss/partner-portal/inventory/poi-entity-matching) tool. |
| **Image policy violation** | **ERROR** | `SAFE_SEARCH_POLICY_VIOLATION_IMAGE` | `image` | **Yes** | Remove or replace the flagged image, or click **Appeal** to submit a justification. See [Google Search content image Policy](https://support.google.com/websearch/answer/10688017). |
| **Text policy violation - Default Name** | **ERROR** | `SAFE_SEARCH_POLICY_VIOLATION_TEXT` | `name.localizations.*.text` | **Yes** | Remove or replace the flagged name text, or click **Appeal** . See [Google Search content text policy](https://support.google.com/websearch/answer/10622781). |
| **Text policy violation - Non-Default Name** | **WARNING** | `SAFE_SEARCH_POLICY_VIOLATION_TEXT` | `name.localizations.*.text` | **No** | Remove or replace the flagged name text. See [Google Search content text policy](https://support.google.com/websearch/answer/10622781). |
| **Text policy violation - Description** | **WARNING** | `SAFE_SEARCH_POLICY_VIOLATION_TEXT` | `description.localizations.*.text` | **No** | Remove or replace the flagged description text. See [Google Search content text policy](https://support.google.com/websearch/answer/10622781). |
| **Text policy violation - Display Address** | **WARNING** | `SAFE_SEARCH_POLICY_VIOLATION_TEXT` | `display_address.localizations.*.text` | **No** | Remove or replace the flagged display address text. See [Google Search content text policy](https://support.google.com/websearch/answer/10622781). |
| **Missing default locale for Establishment Category** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.establishment_category.default_locale` | **No** | Provide a value for the localized establishment category of the POI matching the declared `default_locale` language. |
| **Missing business hours open day** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.business_hours.time_ranges.open_day` | **No** | Provide a valid business hours open day. |
| **Missing business hours open time** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.business_hours.time_ranges.open_time` | **No** | Provide valid business hours open time. |
| **Missing business hours close day** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.business_hours.time_ranges.close_day` | **No** | Provide a valid business hours close day. |
| **Missing business hours close time** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.business_hours.time_ranges.close_time` | **No** | Provide a valid business hours close time. |
| **Business hours open time is greater than close time** | **ERROR** | `NOT_LESS_THAN_FIELD` | `local_data.business_hours.time_ranges.open_time`, `local_data.business_hours.time_ranges.close_time` | **No** | Provide a valid pair of open and close time, ensuring the open time is lower than close time. |
| **Price range min value is greater than max value** | **ERROR** | `INVALID_PRICE_RANGE` | `local_data.price_range.min_price`, `local_data.price_range.max_price` | **No** | Provide a valid price range, with the minimum price lower than the maximum price. |
| **Missing Brand Id** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.brand_landing_pages.brand_id` | **No** | Provide a valid brand id. |
| **Duplicated Brand Id within a POI** | **ERROR** | `DUPLICATE_UNIQUE_PROPERTY` | `local_data.brand_landing_pages.brand_id` | **No** | Ensure each `brand_id` is unique across the POI payload. Remove duplicate entries. |
| **Missing brand default URL** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.brand_landing_pages.default_url` | **No** | Provide a valid brand default URL. |
| **Malformed or invalid Brand URL** | **ERROR** | `INVALID_ATTRIBUTE_VALUE` | `local_data.brand_landing_pages.default_url` | **No** | Ensure the brand default URL uses a supported HTTP/HTTPS protocol and valid syntax. |
| **Missing brand localized landing page URL** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.brand_landing_pages.localized_landing_pages.url` | **No** | Provide a valid URL for the localized landing page. |
| **Malformed or invalid brand localized landing page URL** | **ERROR** | `INVALID_ATTRIBUTE_VALUE` | `local_data.brand_landing_pages.localized_landing_pages.url` | **No** | Ensure the localized landing page URL uses a supported HTTP/HTTPS protocol and valid syntax. |
| **Duplicated brand localized landing page URL** | **ERROR** | `DUPLICATE_UNIQUE_PROPERTY` | `local_data.brand_landing_pages.localized_landing_pages.url` | **No** | Ensure each `url` is unique across the POI localized landing pages. Remove duplicate entries. |
| **Missing brand localized landing page locale** | **ERROR** | `MISSING_REQUIRED_FIELD` | `local_data.brand_landing_pages.localized_landing_pages.locales` | **No** | Provide a valid set of locales for the localized landing page. |
| **Duplicated brand localized landing page locale** | **ERROR** | `DUPLICATE_UNIQUE_PROPERTY` | `local_data.brand_landing_pages.localized_landing_pages.locales` | **No** | Ensure each `locale` is unique across the POI localized landing pages. Remove duplicate entries. |
| **Text policy violation - Establishment Category** | **WARNING** | `SAFE_SEARCH_POLICY_VIOLATION_TEXT` | `local_data.establishment_category.localizations.*.text` | **No** | Remove or replace the flagged establishment category text. See [Google Search content text policy](https://support.google.com/websearch/answer/10622781). |

## Issue Codes

The following sections provide detailed causes and remediation steps for each
issue code.

### Missing required field

**Issue Code:** `MISSING_REQUIRED_FIELD`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Resolve by updating your POI feed)

This error occurs when an ingested entity is missing one or more mandatory
attributes required by the
[Point of Interest Feed Specification](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#feed_specifications).

Check the **Issue Details panel** to identify which specific property is
missing, then apply the corresponding fix:

#### 1. Missing POI ID (`poi_id`)

- **Cause:** The `poi_id` field is empty, null, or missing from the root entity object.
- **Remediation:** Provide a persistent, unique string identifier for the property.

    {
      "poi_id": "test_restaurant_1"
    }

#### 2. Missing Default Locale Or Localized Name (`name`)

- **Cause:** The `name` object is missing the `default_locale` string or the `localizations` array with a matching locale.
- **Remediation:** Provide both the `default_locale` and at least one localization entry matching that locale.

    {
      "name": {
        "localizations": [
          {
            "locale": "en",
            "text": "Tasty Bites Test Restaurant"
          }
        ],
        "default_locale": "en"
      }
    }

#### 3. Missing Default Locale or Localized Address (`display_address`)

- **Cause:** The `display_address` object is missing the `default_locale` string or the `localizations` array.
- **Remediation:** Provide both the `default_locale` and at least one localization entry matching that locale for the formatted street address.

    {
      "display_address": {
        "localizations": [
          {
            "locale": "en",
            "text": "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
          }
        ],
        "default_locale": "en"
      }
    }

#### 4. Missing Default Locale or Localized Description (`description`)

- **Cause:** When the `description` object is included, either `default_locale` or the matching localization is missing.
- **Remediation:** Provide both the `default_locale` and at least one localization entry matching that locale for the description.

    {
      "description": {
        "localizations": [
          {
            "locale": "en",
            "text": "A mock restaurant for testing the POI feed ingestion."
          }
        ],
        "default_locale": "en"
      }
    }

#### 5. Missing Geographic Coordinates (`location.latitude` / `location.longitude`)

- **Cause:** The `location` object is missing either the `latitude` or `longitude` numerical value.
- **Remediation:** Provide both `latitude` and `longitude` as floating-point numbers in standard WGS84 decimal degrees.

    {
      "location": {
        "latitude": 37.422,
        "longitude": -122.084
      }
    }

#### 6. Missing Structured Postal Address (`location.address`)

- **Cause:** The `location.address` object is missing mandatory address components (`country`, `locality`, or `postal_code`).
- **Remediation:** Populate the structured postal address object per ISO standards.

    {
      "location": {
        "address": {
          "country": "US",
          "locality": "Mountain View",
          "postal_code": "94043",
          "street_address": "1600 Amphitheatre Pkwy"
        }
      }
    }

#### 7. Missing Default Locale for Establishment Category (`local_data.establishment_category.default_locale`)

- **Cause:** The `local_data.establishment_category` object is present, but `default_locale` is missing, empty, or does not match any entry in the `localizations` array.
- **Remediation:** Specify a valid BCP 47 language tag for `default_locale` and supply at least one localized string matching that locale.

    {
      "local_data": {
        "establishment_category": {
          "default_locale": "en",
          "localizations": [
            {
              "locale": "en",
              "text": "Restaurant"
            }
          ]
        }
      }
    }

#### 8. Missing Business Hours Open Day (`local_data.business_hours.time_ranges.open_day`)

- **Cause:** An entry in `local_data.business_hours.time_ranges` is missing `open_day` or it is set to `DAY_OF_WEEK_UNSPECIFIED`.
- **Remediation:** Provide a valid day-of-week string (e.g., `"MONDAY"`, `"TUESDAY"`, etc.).

    {
      "local_data": {
        "business_hours": {
          "time_ranges": [
            {
              "open_day": "MONDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "MONDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            }
          ]
        }
      }
    }

#### 9. Missing Business Hours Open Time (`local_data.business_hours.time_ranges.open_time`)

- **Cause:** An entry in `local_data.business_hours.time_ranges` is missing the `open_time` object.
- **Remediation:** Specify `open_time` with `hours` (0--23) and `minutes` (0--59).

    {
      "local_data": {
        "business_hours": {
          "time_ranges": [
            {
              "open_day": "MONDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "MONDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            }
          ]
        }
      }
    }

#### 10. Missing Business Hours Close Day (`local_data.business_hours.time_ranges.close_day`)

- **Cause:** An entry in `local_data.business_hours.time_ranges` is missing `close_day` or it is set to `DAY_OF_WEEK_UNSPECIFIED`.
- **Remediation:** Provide a valid day-of-week string (e.g., `"MONDAY"`, `"TUESDAY"`, etc.).

    {
      "local_data": {
        "business_hours": {
          "time_ranges": [
            {
              "open_day": "MONDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "MONDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            }
          ]
        }
      }
    }

#### 11. Missing Business Hours Close Time (`local_data.business_hours.time_ranges.close_time`)

- **Cause:** An entry in `local_data.business_hours.time_ranges` is missing the `close_time` object.
- **Remediation:** Specify `close_time` with `hours` (0--23) and `minutes` (0--59).

    {
      "local_data": {
        "business_hours": {
          "time_ranges": [
            {
              "open_day": "MONDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "MONDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            }
          ]
        }
      }
    }

#### 12. Missing Brand ID (`local_data.brand_landing_pages.brand_id`)

- **Cause:** An entry in `local_data.brand_landing_pages` has an empty, null, or missing `brand_id`.
- **Remediation:** Provide a non-empty string identifier matching your registered partner brand configuration.

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "tasty_bites_brand",
            "default_url": "https://www.tastybitestest.com"
          }
        ]
      }
    }

#### 13. Missing Brand Default URL (`local_data.brand_landing_pages.default_url`)

- **Cause:** An entry in `local_data.brand_landing_pages` is missing `default_url` or it is an empty string.
- **Remediation:** Provide a valid fallback HTTP/HTTPS landing page URL for users whose locale is not matched by localized URLs.

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "tasty_bites_brand",
            "default_url": "https://www.tastybitestest.com"
          }
        ]
      }
    }

#### 14. Missing Brand Localized Landing Page URL (`local_data.brand_landing_pages.localized_landing_pages.url`)

- **Cause:** An item inside `localized_landing_pages` has a missing or empty `url` field.
- **Remediation:** Provide a valid, fully-qualified HTTP/HTTPS URL for the localized landing page.

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "tasty_bites_brand",
            "default_url": "https://www.tastybitestest.com",
            "localized_landing_pages": [
              {
                "url": "https://www.tastybitestest.com/en",
                "locales": ["en-US", "en-GB"]
              }
            ]
          }
        ]
      }
    }

#### 15. Missing Brand Localized Landing Page Locale (`local_data.brand_landing_pages.localized_landing_pages.locales`)

- **Cause:** An item inside `localized_landing_pages` has a missing or empty `locales` array.
- **Remediation:** Provide at least one valid BCP 47 language or locale code (e.g., `["en-US"]`) in the `locales` array.

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "tasty_bites_brand",
            "default_url": "https://www.tastybitestest.com",
            "localized_landing_pages": [
              {
                "url": "https://www.tastybitestest.com/en",
                "locales": ["en-US", "en-GB"]
              }
            ]
          }
        ]
      }
    }

### Exceeded maximum image count

**Issue Code:** `EXCEEDED_MAX_COUNT`  

**Severity:** Warning  

**Appealable:** No (Resolve by updating feed payload)

This error occurs when a POI entity payload contains more than **5 image
objects** in the `images` array.

#### Remediation:

- Trim the `images` array so that it contains at most 5 high-quality, representative photos of the local property.
- Any images exceeding the limit of 5 will be discarded.

### Invalid geographic coordinates

**Issue Code:** `INVALID_LATLNG`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Resolve by updating feed payload)

This error occurs when the geographic coordinates provided in
`location.latitude` or `location.longitude` fall outside valid spherical bounds
or represent unpopulated null coordinates.

#### Common Causes \& Remediation:

- **Out-of-Bounds Latitude:** Latitude must be a floating-point number between `-90.0` and `90.0` inclusive.
- **Out-of-Bounds Longitude:** Longitude must be a floating-point number between `-180.0` and `180.0` inclusive.
- **Null Island (0,0):** Submitting `0.0, 0.0` or placeholder integers (such as `999, 999`) triggers coordinate rejection.
- **Swapped Coordinates:** Verify that latitude and longitude are not inverted in your serialization pipeline.

**Valid Payload Example:**

    {
      "location": {
        "latitude": 37.422,
        "longitude": -122.084
      }
    }

### Malformed or invalid URL

**Issue Code:** `INVALID_ATTRIBUTE_VALUE`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Resolve by updating feed payload)

This error occurs when an attribute value fails schema validation, most commonly
when a partner landing page URL or image URL is syntactically invalid.

#### Requirements:

- **Protocol:** URLs must explicitly specify `http://` or `https://` (HTTPS is strongly recommended).
- **Encoding:** URLs containing special characters, spaces, or non-ASCII characters must be properly percent-encoded (RFC 3986).
- **Canonical Domain:** Ensure the domain is fully qualified (for example, `https://example.com/local/123`, not `example.com/local/123` or `www.example`).

**Valid Payload Example:**

    {
      "url": "https://www.tastybitestest.com/en"
    }

### Invalid or unreachable image

**Issue Code:** `INVALID_IMAGE`  

**Severity:** Warning  

**Appealable:** No (Resolve by updating feed payload)

This warning occurs during the asynchronous image fetching stage when Google's
crawler cannot download, decode, or verify the media asset from `image.url`.
While the invalid image is omitted, the property remains eligible to serve.

#### Common Causes \& Remediation:

- **HTTP Errors (404 / 403 / 500):** The image URL returns a non-200 HTTP status code. Ensure images are publicly accessible without authentication, cookie walls, or IP allowlisting restrictions.
- **Robots.txt Blocking:** Ensure your Content Delivery Network (CDN) allows the `Googlebot` and `Googlebot-Image` user agents.
- **Unsupported File Format:** Images must be in standard raster formats (`JPEG`, `PNG`, `WebP`). Animated GIFs, SVGs, and raw camera formats are not supported. See our [image guidelines](https://developers.google.com/actions-center/verticals/local_vss/reference/poi-feed-doc#image_guidelines) for more details.
- **SSL Certificate Failures:** Verify that the image host server has a valid SSL certificate chain.

### Duplicate POI ID

**Issue Code:** `DUPLICATE_ENTITY`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Resolve by updating feed payload)

This error occurs when the same `poi_id` string appears more than once within a
single feed fileset.

#### Remediation:

- Ensure every local listing in your feed has a unique, deterministic `poi_id`.
- If a local property has multiple room types or rates, consolidate them under a single root POI entity rather than emitting duplicate entity records with identical IDs.

### Duplicate matched entity

**Issue Code:** `DUPLICATE_MATCHED_ENTITY`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Resolve by updating feed payload or using POI Entity
Matching tools)

This error occurs when two or more distinct `poi_id` entries in your feed match
to the same canonical Google Maps place listing. When multiple businesses map to
the same Google entity, all colliding entries are blocked from serving until the
duplication is resolved.

#### How to Resolve:

1. **Identify the colliding properties:** Open the [Ingestion Viewer](https://developers.google.com/actions-center/verticals/local_vss/partner-portal/dashboards/ingestion-viewer) (**Ingestion \> History** ), select your latest ingestion run, and expand the **Validations** panel. Click the `DUPLICATE_MATCHED_ENTITY` row that shares the same **Issue Info** group identifier to view all `poi_id` records that matched to the same Google entity.
2. **Remove duplicate listings from your feed:** If the colliding `poi_id` entries represent the same physical business location, remove the duplicate entries from your feed so that only a single `poi_id` is submitted for that establishment.
3. **Adjust incorrect matches for independent businesses:** If the colliding `poi_id` entries represent separate, independent businesses that were incorrectly matched to the same Google entity, open the incorrectly matched business in the Inventory View and click **Edit match** to select or propose the dedicated Google Maps place listing. Detailed instructions are available in the POI [Entity Matching](https://developers.google.com/actions-center/verticals/local_vss/partner-portal/inventory/poi-entity-matching) guide.

### Unmatched entity

**Issue Code:** `UNMATCHED_ENTITY`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Use POI Entity Matching tools or correct entity metadata)

This issue indicates that Google's matching pipeline was unable to reconcile
your local listing with a canonical place in Google Maps.

#### How to Resolve:

1. **Verify Core Attributes:** Ensure the local's `name`, `display_address`, `location.address`, `url`, `telephone`, and `location.latitude`/`location.longitude` precisely reflect the physical property location.
2. **Inspect Match Information:** Look at the **Match Info** column in the Inventory View to see candidate places.
3. **Use the POI Match Fix Tool:** Click **Edit Match** in the Actions Center to manually search for and confirm the correct Google Place ID. Detailed instructions are available in the POI [Entity Matching](https://developers.google.com/actions-center/verticals/local_vss/partner-portal/inventory/poi-entity-matching) guide.

### Google Search Image policy violation

**Issue Code:** `SAFE_SEARCH_POLICY_VIOLATION_IMAGE`  

**Severity:** ERROR (Blocks Serving)  

**Appealable:** Yes

**See the Relevant Policy Issue Codes Here:** Google Search content
[image Policy](https://support.google.com/websearch/answer/10688017)

If you believe the image was flagged in error (false positive), click **Create
Appeal** in the Issue Details panel.

### Google Search Content Text policy violation - Name

**Issue Code:** `SAFE_SEARCH_POLICY_VIOLATION_TEXT`  

**Severity:** Severity varies per field (see the following details)  

**Affected Field:** `name.localizations.*.text`  

**Appealable:** Yes (Default locale ERROR only); No (Non-default locale Warning)

- **Default locale (`name.default_locale`):** **ERROR (Blocks Serving).** The entire POI is blocked from serving. If you believe the default locale name text was flagged in error (false positive), click **Create Appeal** in the Issue Details panel.
- **Non-default locale:** **Warning (Does Not Block Serving).** Only the flagged localization is omitted while the POI remains eligible to serve. Warnings on non-default locales are not appealable and can be resolved by updating your feed payload.

**See the Relevant Policy Issue Codes Here:** Google Search content
[text Policy](https://developers.google.com/actions-center/verticals/local_vss/policies/integration-policies)

### Google Search Content Text policy violation - Description

**Issue Code:** `SAFE_SEARCH_POLICY_VIOLATION_TEXT`  

**Severity:** Warning (Does Not Block Serving)  

**Affected Field:** `description.localizations.*.text`  

**Appealable:** No (Resolve by updating feed payload)

This warning occurs when textual copy in `description.localizations` is flagged
for violating the Google Search content text policy. While the flagged
description localization (or the entire `description` field if the default
locale is flagged) is omitted, the POI remains eligible to serve.

**See the Relevant Policy Issue Codes Here:** Google Search content
[text Policy](https://developers.google.com/actions-center/verticals/local_vss/policies/integration-policies)

### Google Search Content Text policy violation - Display Address

**Issue Code:** `SAFE_SEARCH_POLICY_VIOLATION_TEXT`  

**Severity:** Warning (Does Not Block Serving)  

**Affected Field:** `display_address.localizations.*.text`  

**Appealable:** No (Resolve by updating feed payload)

This warning occurs when formatted address text in
`display_address.localizations` contains content prohibited in the Google Search
content text policy. While the flagged address localization (or the entire
`display_address` field if the default locale is flagged) is omitted, the POI
remains eligible to serve.

**See the Relevant Policy Issue Codes Here:** Google Search content
[text Policy](https://developers.google.com/actions-center/verticals/local_vss/policies/integration-policies)

### Business hours open time is greater than close time

**Issue Code:** `NOT_LESS_THAN_FIELD`  

**Severity:** Error (Blocks Serving)  

**Affected Fields:** `local_data.business_hours.time_ranges.open_time`,
`local_data.business_hours.time_ranges.close_time`  

**Appealable:** No (Resolve by updating feed payload)

This error occurs when the business hours `open_time` is later than or equal to
`close_time` for the same day interval.

#### Common Causes \& Remediation:

- **Same-Day Inversion:** Ensure `open_time` is earlier than `close_time` (e.g., 09:00 to 17:00).
- **Overnight Shifts:** If an establishment opens on one day and closes past midnight into the next day (e.g., 21:00 to 02:00), set `close_day` to the following day (e.g., `open_day`: `"FRIDAY"`, `close_day`: `"SATURDAY"`).

**Valid Payload Example:**

    {
      "local_data": {
        "business_hours": {
          "time_ranges": [
            {
              "open_day": "MONDAY",
              "open_time": { "hours": 9, "minutes": 0 },
              "close_day": "MONDAY",
              "close_time": { "hours": 17, "minutes": 0 }
            }
          ]
        }
      }
    }

### Price range min value is greater than max value

**Issue Code:** `INVALID_PRICE_RANGE`  

**Severity:** Error (Blocks Serving)  

**Affected Fields:** `local_data.price_range.min_price`,
`local_data.price_range.max_price`  

**Appealable:** No (Resolve by updating feed payload)

This error occurs when the `min_price` exceeds the `max_price` in value, or if
`min_price` and `max_price` specify different currency codes.

#### Common Causes \& Remediation:

- **Inverted Values:** Ensure `min_price` is lower than or equal to `max_price`.
- **Currency Mismatch:** Verify that both `min_price.currency_code` and `max_price.currency_code` match the same ISO 4217 three-letter currency code (e.g., `"USD"`).

**Valid Payload Example:**

    {
      "local_data": {
        "price_range": {
          "min_price": {
            "currency_code": "USD",
            "units": 15,
            "nanos": 0
          },
          "max_price": {
            "currency_code": "USD",
            "units": 45,
            "nanos": 0
          }
        }
      }
    }

### Duplicate unique property within a POI

**Issue Code:** `DUPLICATE_UNIQUE_PROPERTY`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Resolve by updating feed payload)

This error occurs when a field or sub-element required to be unique across a
single POI entity contains duplicated entries.

Check the Issue Details panel to identify which property violates uniqueness:

#### 1. Duplicated Brand ID within a POI (`local_data.brand_landing_pages.brand_id`)

- **Cause:** The same `brand_id` string appears in multiple `brand_landing_pages` entries for a single POI.
- **Remediation:** Consolidate all landing pages for that brand into a single `brand_landing_pages` object.

**Valid Payload Example:**

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "brand_zenchef",
            "default_url": "https://bookings.zenchef.com/results?rid=287722"
          },
          {
            "brand_id": "brand_opentable",
            "default_url": "https://www.opentable.com/r/287722"
          }
        ]
      }
    }

#### 2. Duplicated Brand Localized Landing Page URL (`local_data.brand_landing_pages.localized_landing_pages.url`)

- **Cause:** The exact same landing page URL is defined multiple times under `localized_landing_pages` for the same brand.
- **Remediation:** Ensure each URL entry is distinct, or associate multiple locales under a single URL entry's `locales` array.

**Valid Payload Example:**

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "brand_zenchef",
            "default_url": "https://bookings.zenchef.com/results?rid=287722",
            "localized_landing_pages": [
              {
                "url": "https://bookings.zenchef.com/en/results?rid=287722",
                "locales": ["en-US"]
              },
              {
                "url": "https://bookings.zenchef.com/fr/results?rid=287722",
                "locales": ["fr-FR"]
              }
            ]
          }
        ]
      }
    }

#### 3. Duplicated Brand Localized Landing Page Locale (`local_data.brand_landing_pages.localized_landing_pages.locales`)

- **Cause:** The same locale code (e.g., `"en-US"`) is repeated across multiple entries in `localized_landing_pages` for the same brand.
- **Remediation:** Assign each locale tag to exactly one localized landing page.

**Valid Payload Example:**

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "brand_zenchef",
            "default_url": "https://bookings.zenchef.com/results?rid=287722",
            "localized_landing_pages": [
              {
                "url": "https://bookings.zenchef.com/en/results?rid=287722",
                "locales": ["en-US", "en-GB"]
              },
              {
                "url": "https://bookings.zenchef.com/fr/results?rid=287722",
                "locales": ["fr-FR"]
              }
            ]
          }
        ]
      }
    }

### Malformed or invalid Brand URL

**Issue Code:** `INVALID_ATTRIBUTE_VALUE`  

**Severity:** Error (Blocks Serving)  

**Appealable:** No (Resolve by updating feed payload)  

**Affected Fields:** `local_data.brand_landing_pages.default_url`,
`local_data.brand_landing_pages.localized_landing_pages.url`

This error occurs when a brand default URL or localized landing page URL fails
URI syntax validation.

#### Requirements:

- **Protocol:** Must explicitly specify `http://` or `https://` (`https://` is required for production serving).
- **Syntax:** Must be a valid, percent-encoded, RFC 3986-compliant URL with a fully qualified domain name.

**Valid Payload Example:**

    {
      "local_data": {
        "brand_landing_pages": [
          {
            "brand_id": "tasty_bites_brand",
            "default_url": "https://www.tastybitestest.com/en",
            "localized_landing_pages": [
              {
                "url": "https://www.tastybitestest.com/en/reservation",
                "locales": ["en-US"]
              }
            ]
          }
        ]
      }
    }

### Google Search Content Text policy violation - Establishment Category

**Issue Code:** `SAFE_SEARCH_POLICY_VIOLATION_TEXT`  

**Severity:** Warning (Does Not Block Serving)  

**Appealable:** No (Resolve by updating feed payload)  

**Affected Field:** `local_data.establishment_category.localizations.*.text`

This warning occurs when localized establishment category text fails automated
SafeSearch content filters. While the flagged establishment category
localization (or the entire `establishment_category` field if the default locale
is flagged) is omitted, the POI remains eligible to serve.

#### Remediation:

- **Policy Compliance:** Remove or replace the flagged establishment category text with standard business category terms that adhere to the [Google Search content text policy](https://support.google.com/websearch/answer/10622781)

**Valid Payload Example:**

    {
      "local_data": {
        "establishment_category": {
          "default_locale": "en",
          "localizations": [
            {
              "locale": "en",
              "text": "Restaurant"
            },
            {
              "locale": "fr",
              "text": "Restaurant gastronomique"
            }
          ]
        }
      }
    }