{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/google-android/json-schema/google-android-products-list-response-schema.json",
  "title": "ProductsListResponse",
  "x-generated": "2026-11-11",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/google-android-androidenterprise-products-api-openapi.yml#/components/schemas/ProductsListResponse",
  "type": "object",
  "properties": {
    "pageInfo": {
      "$ref": "#/$defs/PageInfo",
      "description": "General pagination information."
    },
    "product": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Product"
      },
      "description": "Information about a product (e.g. an app) in the Google Play store, for display to an enterprise admin."
    },
    "tokenPagination": {
      "$ref": "#/$defs/TokenPagination",
      "description": "Pagination information for token pagination."
    }
  },
  "$defs": {
    "AppRestrictionsSchema": {
      "properties": {
        "kind": {
          "description": "Deprecated.",
          "type": "string"
        },
        "restrictions": {
          "type": "array",
          "description": "The set of restrictions that make up this schema.",
          "items": {
            "$ref": "#/$defs/AppRestrictionsSchemaRestriction"
          }
        }
      },
      "description": "Represents the list of app restrictions available to be pre-configured for the product.",
      "type": "object"
    },
    "AppRestrictionsSchemaRestriction": {
      "properties": {
        "nestedRestriction": {
          "type": "array",
          "description": "For bundle or bundleArray restrictions, the list of nested restrictions. A bundle restriction is always nested within a bundleArray restriction, and a bundleArray restriction is at most two levels deep.",
          "items": {
            "$ref": "#/$defs/AppRestrictionsSchemaRestriction"
          }
        },
        "entryValue": {
          "description": "For choice or multiselect restrictions, the list of possible entries' machine-readable values. These values should be used in the configuration, either as a single string value for a choice restriction or in a stringArray for a multiselect restriction.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "defaultValue": {
          "$ref": "#/$defs/AppRestrictionsSchemaRestrictionRestrictionValue",
          "description": "The default value of the restriction. bundle and bundleArray restrictions never have a default value."
        },
        "title": {
          "type": "string",
          "description": "The name of the restriction."
        },
        "key": {
          "type": "string",
          "description": "The unique key that the product uses to identify the restriction, e.g. \"com.google.android.gm.fieldname\"."
        },
        "description": {
          "type": "string",
          "description": "A longer description of the restriction, giving more detail of what it affects."
        },
        "restrictionType": {
          "type": "string",
          "description": "The type of the restriction.",
          "enum": [
            "bool",
            "string",
            "integer",
            "choice",
            "multiselect",
            "hidden",
            "bundle",
            "bundleArray"
          ]
        },
        "entry": {
          "type": "array",
          "description": "For choice or multiselect restrictions, the list of possible entries' human-readable names.",
          "items": {
            "type": "string"
          }
        }
      },
      "description": "A restriction in the App Restriction Schema represents a piece of configuration that may be pre-applied.",
      "type": "object"
    },
    "AppRestrictionsSchemaRestrictionRestrictionValue": {
      "properties": {
        "type": {
          "type": "string",
          "description": "The type of the value being provided.",
          "enum": [
            "bool",
            "string",
            "integer",
            "choice",
            "multiselect",
            "hidden",
            "bundle",
            "bundleArray"
          ]
        },
        "valueString": {
          "type": "string",
          "description": "The string value - this will be present for types string, choice and hidden."
        },
        "valueBool": {
          "type": "boolean",
          "description": "The boolean value - this will only be present if type is bool."
        },
        "valueMultiselect": {
          "description": "The list of string values - this will only be present if type is multiselect.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "valueInteger": {
          "format": "int32",
          "description": "The integer value - this will only be present if type is integer.",
          "type": "integer"
        }
      },
      "type": "object",
      "description": "A typed value for the restriction."
    },
    "AppVersion": {
      "description": "This represents a single version of the app.",
      "type": "object",
      "properties": {
        "targetSdkVersion": {
          "format": "int32",
          "type": "integer",
          "description": "The SDK version this app targets, as specified in the manifest of the APK. See http://developer.android.com/guide/topics/manifest/uses-sdk-element.html"
        },
        "trackId": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Track ids that the app version is published in. Replaces the track field (deprecated), but doesn't include the production track (see isProduction instead)."
        },
        "isProduction": {
          "type": "boolean",
          "description": "True if this version is a production APK."
        },
        "track": {
          "description": "Deprecated, use trackId instead.",
          "type": "string",
          "enum": [
            "appTrackUnspecified",
            "production",
            "beta",
            "alpha"
          ]
        },
        "versionString": {
          "description": "The string used in the Play store by the app developer to identify the version. The string is not necessarily unique or localized (for example, the string could be \"1.4\").",
          "type": "string"
        },
        "versionCode": {
          "format": "int32",
          "type": "integer",
          "description": "Unique increasing identifier for the app version."
        }
      }
    },
    "PageInfo": {
      "description": "Information about the current page. List operations that supports paging return only one \"page\" of results. This protocol buffer message describes the page that has been returned.",
      "properties": {
        "resultPerPage": {
          "format": "int32",
          "description": "Maximum number of results returned in one page. ! The number of results included in the API response.",
          "type": "integer"
        },
        "totalResults": {
          "format": "int32",
          "description": "Total number of results available on the backend ! The total number of results in the result set.",
          "type": "integer"
        },
        "startIndex": {
          "type": "integer",
          "format": "int32",
          "description": "Index of the first result returned in the current page."
        }
      },
      "type": "object"
    },
    "Product": {
      "description": "A Products resource represents an app in the Google Play store that is available to at least some users in the enterprise. (Some apps are restricted to a single enterprise, and no information about them is made available outside that enterprise.) The information provided for each product (localized name, icon, link to the full Google Play details page) is intended to allow a basic representation of the product within an EMM user interface.",
      "properties": {
        "title": {
          "type": "string",
          "description": "The name of the product."
        },
        "description": {
          "description": "The localized promotional description, if available.",
          "type": "string"
        },
        "category": {
          "type": "string",
          "description": "The app category (e.g. RACING, SOCIAL, etc.)"
        },
        "iconUrl": {
          "type": "string",
          "description": "A link to an image that can be used as an icon for the product. This image is suitable for use at up to 512px x 512px."
        },
        "contentRating": {
          "type": "string",
          "description": "The content rating for this app.",
          "enum": [
            "ratingUnknown",
            "all",
            "preTeen",
            "teen",
            "mature"
          ]
        },
        "permissions": {
          "type": "array",
          "description": "A list of permissions required by the app.",
          "items": {
            "$ref": "#/$defs/ProductPermission"
          }
        },
        "productPricing": {
          "description": "Whether this product is free, free with in-app purchases, or paid. If the pricing is unknown, this means the product is not generally available anymore (even though it might still be available to people who own it).",
          "type": "string",
          "enum": [
            "unknown",
            "free",
            "freeWithInAppPurchase",
            "paid"
          ]
        },
        "screenshotUrls": {
          "description": "A list of screenshot links representing the app.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "detailsUrl": {
          "type": "string",
          "description": "A link to the (consumer) Google Play details page for the product."
        },
        "appVersion": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AppVersion"
          },
          "description": "App versions currently available for this product."
        },
        "availableTracks": {
          "items": {
            "enum": [
              "appTrackUnspecified",
              "production",
              "beta",
              "alpha"
            ],
            "type": "string"
          },
          "type": "array",
          "description": "Deprecated, use appTracks instead."
        },
        "appTracks": {
          "description": "The tracks visible to the enterprise.",
          "items": {
            "$ref": "#/$defs/TrackInfo"
          },
          "type": "array"
        },
        "distributionChannel": {
          "type": "string",
          "description": "How and to whom the package is made available. The value publicGoogleHosted means that the package is available through the Play store and not restricted to a specific enterprise. The value privateGoogleHosted means that the package is a private app (restricted to an enterprise) but hosted by Google. The value privateSelfHosted means that the package is a private app (restricted to an enterprise) and is privately hosted.",
          "enum": [
            "publicGoogleHosted",
            "privateGoogleHosted",
            "privateSelfHosted"
          ]
        },
        "recentChanges": {
          "type": "string",
          "description": "A description of the recent changes made to the app."
        },
        "features": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "featureUnknown",
              "vpnApp"
            ]
          },
          "description": "Noteworthy features (if any) of this product."
        },
        "workDetailsUrl": {
          "description": "A link to the managed Google Play details page for the product, for use by an Enterprise admin.",
          "type": "string"
        },
        "fullDescription": {
          "type": "string",
          "description": "The localized full app store description, if available."
        },
        "appRestrictionsSchema": {
          "$ref": "#/$defs/AppRestrictionsSchema",
          "description": "The app restriction schema"
        },
        "requiresContainerApp": {
          "description": "Deprecated.",
          "type": "boolean"
        },
        "authorName": {
          "description": "The name of the author of the product (for example, the app developer).",
          "type": "string"
        },
        "availableCountries": {
          "description": "The countries which this app is available in.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "signingCertificate": {
          "$ref": "#/$defs/ProductSigningCertificate",
          "description": "The certificate used to sign this product."
        },
        "smallIconUrl": {
          "type": "string",
          "description": "A link to a smaller image that can be used as an icon for the product. This image is suitable for use at up to 128px x 128px."
        },
        "lastUpdatedTimestampMillis": {
          "format": "int64",
          "description": "The approximate time (within 7 days) the app was last published, expressed in milliseconds since epoch.",
          "type": "string"
        },
        "productId": {
          "type": "string",
          "description": "A string of the form *app:<package name>*. For example, app:com.google.android.gm represents the Gmail app."
        },
        "minAndroidSdkVersion": {
          "description": "The minimum Android SDK necessary to run the app.",
          "format": "int32",
          "type": "integer"
        }
      },
      "type": "object"
    },
    "ProductPermission": {
      "type": "object",
      "description": "A product permissions resource represents the set of permissions required by a specific app and whether or not they have been accepted by an enterprise admin. The API can be used to read the set of permissions, and also to update the set to indicate that permissions have been accepted.",
      "properties": {
        "state": {
          "enum": [
            "required",
            "accepted"
          ],
          "description": "Whether the permission has been accepted or not.",
          "type": "string"
        },
        "permissionId": {
          "type": "string",
          "description": "An opaque string uniquely identifying the permission."
        }
      }
    },
    "ProductSigningCertificate": {
      "properties": {
        "certificateHashSha256": {
          "type": "string",
          "description": "The base64 urlsafe encoded SHA2-256 hash of the certificate."
        },
        "certificateHashSha1": {
          "description": "The base64 urlsafe encoded SHA1 hash of the certificate. (This field is deprecated in favor of SHA2-256. It should not be used and may be removed at any time.)",
          "type": "string"
        }
      },
      "type": "object"
    },
    "TokenPagination": {
      "type": "object",
      "properties": {
        "previousPageToken": {
          "type": "string"
        },
        "nextPageToken": {
          "description": "Tokens to pass to the standard list field 'page_token'. Whenever available, tokens are preferred over manipulating start_index.",
          "type": "string"
        }
      },
      "description": "Pagination information returned by a List operation when token pagination is enabled. List operations that supports paging return only one \"page\" of results. This protocol buffer message describes the page that has been returned. When using token pagination, clients should use the next/previous token to get another page of the result. The presence or absence of next/previous token indicates whether a next/previous page is available and provides a mean of accessing this page. ListRequest.page_token should be set to either next_page_token or previous_page_token to access another page."
    },
    "TrackInfo": {
      "description": "Id to name association of a track.",
      "properties": {
        "trackId": {
          "description": "Unmodifiable, unique track identifier. This identifier is the releaseTrackId in the url of the play developer console page that displays the track information.",
          "type": "string"
        },
        "trackAlias": {
          "description": "A modifiable name for a track. This is the visible name in the play developer console.",
          "type": "string"
        }
      },
      "type": "object"
    }
  }
}