{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/google-pay/json-schema/google-pay-transit-object-schema.json",
  "title": "TransitObject",
  "x-generated": "2026-11-04",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/google-pay-wallet-openapi.yml#/components/schemas/TransitObject",
  "type": "object",
  "properties": {
    "rotatingBarcode": {
      "$ref": "#/$defs/RotatingBarcode"
    },
    "id": {
      "type": "string",
      "description": "Required. The unique identifier for an object. This ID must be unique across all objects from an issuer. This value should follow the format issuer ID.identifier where the former is issued by Google and latter is chosen by you. The unique identifier should only include alphanumeric characters, '.', '_', or '-'."
    },
    "infoModuleData": {
      "$ref": "#/$defs/InfoModuleData"
    },
    "hexBackgroundColor": {
      "type": "string",
      "description": "The background color for the card. If not set the dominant color of the hero image is used, and if no hero image is set, the dominant color of the logo is used. The format is #rrggbb where rrggbb is a hex RGB triplet, such as `#ffcc00`. You can also use the shorthand version of the RGB triplet which is #rgb, such as `#fc0`."
    },
    "classId": {
      "type": "string",
      "description": "Required. The class associated with this object. The class must be of the same type as this object, must already exist, and must be approved. Class IDs should follow the format issuer ID.identifier where the former is issued by Google and latter is chosen by you."
    },
    "barcode": {
      "$ref": "#/$defs/Barcode"
    },
    "version": {
      "type": "string",
      "format": "int64",
      "description": "Deprecated"
    },
    "valueAddedModuleData": {
      "type": "array",
      "description": "Optional value added module data. Maximum of fifteen on the object. For a pass only fifteen will be displayed.",
      "items": {
        "$ref": "#/$defs/ValueAddedModuleData"
      }
    },
    "appLinkData": {
      "$ref": "#/$defs/AppLinkData"
    },
    "ticketLeg": {
      "$ref": "#/$defs/TicketLeg"
    },
    "hasUsers": {
      "type": "boolean",
      "description": "Indicates if the object has users. This field is set by the platform."
    },
    "passengerType": {
      "type": "string",
      "description": "The number of passengers.",
      "enum": [
        "PASSENGER_TYPE_UNSPECIFIED",
        "SINGLE_PASSENGER",
        "singlePassenger",
        "MULTIPLE_PASSENGERS",
        "multiplePassengers"
      ]
    },
    "tripType": {
      "type": "string",
      "description": "Required. The type of trip this transit object represents. Used to determine the pass title and/or which symbol to use between the origin and destination.",
      "enum": [
        "TRIP_TYPE_UNSPECIFIED",
        "ROUND_TRIP",
        "roundTrip",
        "ONE_WAY",
        "oneWay"
      ]
    },
    "concessionCategory": {
      "type": "string",
      "description": "The concession category for the ticket.",
      "enum": [
        "CONCESSION_CATEGORY_UNSPECIFIED",
        "ADULT",
        "adult",
        "CHILD",
        "child",
        "SENIOR",
        "senior"
      ]
    },
    "linksModuleData": {
      "$ref": "#/$defs/LinksModuleData"
    },
    "saveRestrictions": {
      "$ref": "#/$defs/SaveRestrictions"
    },
    "deviceContext": {
      "$ref": "#/$defs/DeviceContext"
    },
    "heroImage": {
      "$ref": "#/$defs/Image"
    },
    "customTicketStatus": {
      "$ref": "#/$defs/LocalizedString"
    },
    "merchantLocations": {
      "type": "array",
      "description": "Merchant locations. There is a maximum of ten on the object. Any additional MerchantLocations added beyond the 10 will be rejected. These locations will trigger a notification when a user enters within a Google-set radius of the point. This field replaces the deprecated LatLongPoints.",
      "items": {
        "$ref": "#/$defs/MerchantLocation"
      }
    },
    "smartTapRedemptionValue": {
      "type": "string",
      "description": "The value that will be transmitted to a Smart Tap certified terminal over NFC for this object. The class level fields `enableSmartTap` and `redemptionIssuers` must also be set up correctly in order for the pass to support Smart Tap. Only ASCII characters are supported."
    },
    "passengerNames": {
      "type": "string",
      "description": "The name(s) of the passengers the ticket is assigned to. The above `passengerType` field is meant to give Google context on this field."
    },
    "ticketRestrictions": {
      "$ref": "#/$defs/TicketRestrictions"
    },
    "messages": {
      "type": "array",
      "description": "An array of messages displayed in the app. All users of this object will receive its associated messages. The maximum number of these fields is 10.",
      "items": {
        "$ref": "#/$defs/Message"
      }
    },
    "customConcessionCategory": {
      "$ref": "#/$defs/LocalizedString"
    },
    "purchaseDetails": {
      "$ref": "#/$defs/PurchaseDetails"
    },
    "classReference": {
      "$ref": "#/$defs/TransitClass"
    },
    "ticketLegs": {
      "type": "array",
      "description": "Each ticket may contain one or more legs. Each leg contains departure and arrival information along with boarding and seating information. If only one leg is to be specified then use the `ticketLeg` field instead. Both `ticketLeg` and `ticketLegs` may not be set.",
      "items": {
        "$ref": "#/$defs/TicketLeg"
      }
    },
    "linkedObjectIds": {
      "type": "array",
      "description": "linked_object_ids are a list of other objects such as event ticket, loyalty, offer, generic, giftcard, transit and boarding pass that should be automatically attached to this transit object. If a user had saved this transit card, then these linked_object_ids would be automatically pushed to the user's wallet (unless they turned off the setting to receive such linked passes). Make sure that objects present in linked_object_ids are already inserted - if not, calls would fail. Once linked, the linked objects cannot be unlinked. You cannot link objects belonging to another issuer. There is a limit to the number of objects that can be linked to a single object. After the limit is reached, new linked objects in the call will be ignored silently. Object IDs should follow the format issuer ID. identifier where the former is issued by Google and the latter is chosen by you.",
      "items": {
        "type": "string"
      }
    },
    "notifyPreference": {
      "type": "string",
      "description": "Whether or not field updates to this object should trigger notifications. When set to NOTIFY, we will attempt to trigger a field update notification to users. These notifications will only be sent to users if the field is part of an allowlist. If set to DO_NOT_NOTIFY or NOTIFICATION_SETTINGS_UNSPECIFIED, no notification will be triggered. This setting is ephemeral and needs to be set with each PATCH or UPDATE request, otherwise a notification will not be triggered.",
      "enum": [
        "NOTIFICATION_SETTINGS_FOR_UPDATES_UNSPECIFIED",
        "NOTIFY_ON_UPDATE"
      ]
    },
    "hasLinkedDevice": {
      "type": "boolean",
      "description": "Whether this object is currently linked to a single device. This field is set by the platform when a user saves the object, linking it to their device. Intended for use by select partners. Contact support for additional information."
    },
    "activationStatus": {
      "$ref": "#/$defs/ActivationStatus"
    },
    "state": {
      "type": "string",
      "description": "Required. The state of the object. This field is used to determine how an object is displayed in the app. For example, an `inactive` object is moved to the \"Expired passes\" section.",
      "enum": [
        "STATE_UNSPECIFIED",
        "ACTIVE",
        "active",
        "COMPLETED",
        "completed",
        "EXPIRED",
        "expired",
        "INACTIVE",
        "inactive"
      ]
    },
    "locations": {
      "type": "array",
      "description": "Note: This field is currently not supported to trigger geo notifications.",
      "items": {
        "$ref": "#/$defs/LatLongPoint"
      }
    },
    "passConstraints": {
      "$ref": "#/$defs/PassConstraints"
    },
    "textModulesData": {
      "type": "array",
      "description": "Text module data. If text module data is also defined on the class, both will be displayed. The maximum number of these fields displayed is 10 from the object and 10 from the class.",
      "items": {
        "$ref": "#/$defs/TextModuleData"
      }
    },
    "ticketStatus": {
      "type": "string",
      "description": "The status of the ticket. For states which affect display, use the `state` field instead.",
      "enum": [
        "TICKET_STATUS_UNSPECIFIED",
        "USED",
        "used",
        "REFUNDED",
        "refunded",
        "EXCHANGED",
        "exchanged"
      ]
    },
    "imageModulesData": {
      "type": "array",
      "description": "Image module data. The maximum number of these fields displayed is 1 from object level and 1 for class object level.",
      "items": {
        "$ref": "#/$defs/ImageModuleData"
      }
    },
    "validTimeInterval": {
      "$ref": "#/$defs/TimeInterval"
    },
    "disableExpirationNotification": {
      "type": "boolean",
      "description": "Indicates if notifications should explicitly be suppressed. If this field is set to true, regardless of the `messages` field, expiration notifications to the user will be suppressed. By default, this field is set to false. Currently, this can only be set for offers."
    },
    "tripId": {
      "type": "string",
      "description": "This id is used to group tickets together if the user has saved multiple tickets for the same trip."
    },
    "ticketNumber": {
      "type": "string",
      "description": "The number of the ticket. This is a unique identifier for the ticket in the transit operator's system."
    },
    "groupingInfo": {
      "$ref": "#/$defs/GroupingInfo"
    }
  },
  "$defs": {
    "ActivationOptions": {
      "type": "object",
      "description": "ActivationOptions for the class",
      "properties": {
        "allowReactivation": {
          "type": "boolean",
          "description": "Flag to allow users to make activation call from different device. This allows client to render the activation button enabled even if the activationStatus is ACTIVATED but the requested device is different than the current device."
        },
        "activationUrl": {
          "type": "string",
          "description": "HTTPS URL that supports REST semantics. Would be used for requesting activation from partners for given valuable, triggered by the users."
        }
      }
    },
    "ActivationStatus": {
      "type": "object",
      "description": "The activation status of the object. This field includes activation status if valuable supports activation.",
      "properties": {
        "state": {
          "type": "string",
          "enum": [
            "UNKNOWN_STATE",
            "NOT_ACTIVATED",
            "not_activated",
            "ACTIVATED",
            "activated"
          ]
        }
      }
    },
    "AppLinkData": {
      "type": "object",
      "properties": {
        "androidAppLinkInfo": {
          "$ref": "#/$defs/AppLinkDataAppLinkInfo"
        },
        "iosAppLinkInfo": {
          "$ref": "#/$defs/AppLinkDataAppLinkInfo"
        },
        "displayText": {
          "$ref": "#/$defs/LocalizedString"
        },
        "webAppLinkInfo": {
          "$ref": "#/$defs/AppLinkDataAppLinkInfo"
        }
      }
    },
    "AppLinkDataAppLinkInfo": {
      "type": "object",
      "properties": {
        "title": {
          "$ref": "#/$defs/LocalizedString"
        },
        "appTarget": {
          "$ref": "#/$defs/AppLinkDataAppLinkInfoAppTarget"
        },
        "appLogoImage": {
          "$ref": "#/$defs/Image"
        },
        "description": {
          "$ref": "#/$defs/LocalizedString"
        }
      }
    },
    "AppLinkDataAppLinkInfoAppTarget": {
      "type": "object",
      "properties": {
        "packageName": {
          "type": "string",
          "description": "Package name for AppTarget. For example: com.google.android.gm"
        },
        "targetUri": {
          "$ref": "#/$defs/Uri"
        }
      }
    },
    "Barcode": {
      "type": "object",
      "properties": {
        "value": {
          "type": "string",
          "description": "The value encoded in the barcode."
        },
        "renderEncoding": {
          "type": "string",
          "description": "The render encoding for the barcode. When specified, barcode is rendered in the given encoding. Otherwise best known encoding is chosen by Google.",
          "enum": [
            "RENDER_ENCODING_UNSPECIFIED",
            "UTF_8"
          ]
        },
        "alternateText": {
          "type": "string",
          "description": "An optional text that will override the default text that shows under the barcode. This field is intended for a human readable equivalent of the barcode value, used when the barcode cannot be scanned."
        },
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#barcode\"`."
        },
        "type": {
          "type": "string",
          "description": "The type of barcode.",
          "enum": [
            "BARCODE_TYPE_UNSPECIFIED",
            "AZTEC",
            "aztec",
            "CODE_39",
            "code39",
            "CODE_128",
            "code128",
            "CODABAR",
            "codabar",
            "DATA_MATRIX",
            "dataMatrix",
            "EAN_8",
            "ean8",
            "EAN_13",
            "ean13",
            "EAN13",
            "ITF_14",
            "itf14",
            "PDF_417",
            "pdf417",
            "PDF417",
            "QR_CODE",
            "qrCode",
            "qrcode",
            "UPC_A",
            "upcA",
            "TEXT_ONLY",
            "textOnly"
          ]
        },
        "showCodeText": {
          "$ref": "#/$defs/LocalizedString"
        }
      }
    },
    "BarcodeSectionDetail": {
      "type": "object",
      "properties": {
        "fieldSelector": {
          "$ref": "#/$defs/FieldSelector"
        }
      }
    },
    "CallbackOptions": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "description": "The HTTPS url configured by the merchant. The URL should be hosted on HTTPS and robots.txt should allow the URL path to be accessible by UserAgent:Googlebot."
        },
        "updateRequestUrl": {
          "type": "string",
          "description": "URL for the merchant endpoint that would be called to request updates. The URL should be hosted on HTTPS and robots.txt should allow the URL path to be accessible by UserAgent:Googlebot. Deprecated."
        }
      }
    },
    "CardBarcodeSectionDetails": {
      "type": "object",
      "properties": {
        "firstBottomDetail": {
          "$ref": "#/$defs/BarcodeSectionDetail"
        },
        "firstTopDetail": {
          "$ref": "#/$defs/BarcodeSectionDetail"
        },
        "secondTopDetail": {
          "$ref": "#/$defs/BarcodeSectionDetail"
        }
      }
    },
    "CardRowOneItem": {
      "type": "object",
      "properties": {
        "item": {
          "$ref": "#/$defs/TemplateItem"
        }
      }
    },
    "CardRowTemplateInfo": {
      "type": "object",
      "properties": {
        "twoItems": {
          "$ref": "#/$defs/CardRowTwoItems"
        },
        "threeItems": {
          "$ref": "#/$defs/CardRowThreeItems"
        },
        "oneItem": {
          "$ref": "#/$defs/CardRowOneItem"
        }
      }
    },
    "CardRowThreeItems": {
      "type": "object",
      "properties": {
        "endItem": {
          "$ref": "#/$defs/TemplateItem"
        },
        "middleItem": {
          "$ref": "#/$defs/TemplateItem"
        },
        "startItem": {
          "$ref": "#/$defs/TemplateItem"
        }
      }
    },
    "CardRowTwoItems": {
      "type": "object",
      "properties": {
        "endItem": {
          "$ref": "#/$defs/TemplateItem"
        },
        "startItem": {
          "$ref": "#/$defs/TemplateItem"
        }
      }
    },
    "CardTemplateOverride": {
      "type": "object",
      "properties": {
        "cardRowTemplateInfos": {
          "type": "array",
          "description": "Template information for rows in the card view. At most three rows are allowed to be specified.",
          "items": {
            "$ref": "#/$defs/CardRowTemplateInfo"
          }
        }
      }
    },
    "ClassTemplateInfo": {
      "type": "object",
      "properties": {
        "cardTemplateOverride": {
          "$ref": "#/$defs/CardTemplateOverride"
        },
        "listTemplateOverride": {
          "$ref": "#/$defs/ListTemplateOverride"
        },
        "cardBarcodeSectionDetails": {
          "$ref": "#/$defs/CardBarcodeSectionDetails"
        },
        "detailsTemplateOverride": {
          "$ref": "#/$defs/DetailsTemplateOverride"
        }
      }
    },
    "DateTime": {
      "type": "object",
      "properties": {
        "date": {
          "type": "string",
          "description": "An ISO 8601 extended format date/time. Offset may or may not be required (refer to the parent field's documentation). Time may be specified up to nanosecond precision. Offsets may be specified with seconds precision (even though offset seconds is not part of ISO 8601). For example: `1985-04-12T23:20:50.52Z` would be 20 minutes and 50.52 seconds after the 23rd hour of April 12th, 1985 in UTC. `1985-04-12T19:20:50.52-04:00` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985, 4 hours before UTC (same instant in time as the above example). If the date/time is intended for a physical location in New York, this would be the equivalent of Eastern Daylight Time (EDT). Remember that offset varies in regions that observe Daylight Saving Time (or Summer Time), depending on the time of the year. `1985-04-12T19:20:50.52` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985 with no offset information. Providing an offset makes this an absolute instant in time around the world. The date/time will be adjusted based on the user's time zone. For example, a time of `2018-06-19T18:30:00-04:00` will be 18:30:00 for a user in New York and 15:30:00 for a user in Los Angeles. Omitting the offset makes this a local date/time, representing several instants in time around the world. The date/time will always be in the user's current time zone. For example, a time of `2018-06-19T18:30:00` will be 18:30:00 for a user in New York and also 18:30:00 for a user in Los Angeles. This is useful when the same local date/time should apply to many physical locations across several time zones."
        }
      }
    },
    "DetailsItemInfo": {
      "type": "object",
      "properties": {
        "item": {
          "$ref": "#/$defs/TemplateItem"
        }
      }
    },
    "DetailsTemplateOverride": {
      "type": "object",
      "properties": {
        "detailsItemInfos": {
          "type": "array",
          "description": "Information for the \"nth\" item displayed in the details list.",
          "items": {
            "$ref": "#/$defs/DetailsItemInfo"
          }
        }
      }
    },
    "DeviceContext": {
      "type": "object",
      "description": "Device context associated with the object.",
      "properties": {
        "deviceToken": {
          "type": "string",
          "description": "If set, redemption information will only be returned to the given device upon activation of the object. This should not be used as a stable identifier to trace a user's device. It can change across different passes for the same device or even across different activations for the same device. When setting this, callers must also set has_linked_device on the object being activated."
        }
      }
    },
    "FieldReference": {
      "type": "object",
      "description": "Reference definition to use with field overrides.",
      "properties": {
        "dateFormat": {
          "type": "string",
          "description": "Only valid if the `fieldPath` references a date field. Chooses how the date field will be formatted and displayed in the UI.",
          "enum": [
            "DATE_FORMAT_UNSPECIFIED",
            "DATE_TIME",
            "dateTime",
            "DATE_ONLY",
            "dateOnly",
            "TIME_ONLY",
            "timeOnly",
            "DATE_TIME_YEAR",
            "dateTimeYear",
            "DATE_YEAR",
            "dateYear",
            "YEAR_MONTH",
            "YEAR_MONTH_DAY"
          ]
        },
        "fieldPath": {
          "type": "string",
          "description": "Path to the field being referenced, prefixed with \"object\" or \"class\" and separated with dots. For example, it may be the string \"object.purchaseDetails.purchasePrice\"."
        }
      }
    },
    "FieldSelector": {
      "type": "object",
      "description": "Custom field selector to use with field overrides.",
      "properties": {
        "fields": {
          "type": "array",
          "description": "If more than one reference is supplied, then the first one that references a non-empty field will be displayed.",
          "items": {
            "$ref": "#/$defs/FieldReference"
          }
        }
      }
    },
    "FirstRowOption": {
      "type": "object",
      "properties": {
        "fieldOption": {
          "$ref": "#/$defs/FieldSelector"
        },
        "transitOption": {
          "type": "string",
          "enum": [
            "TRANSIT_OPTION_UNSPECIFIED",
            "ORIGIN_AND_DESTINATION_NAMES",
            "originAndDestinationNames",
            "ORIGIN_AND_DESTINATION_CODES",
            "originAndDestinationCodes",
            "ORIGIN_NAME",
            "originName"
          ]
        }
      }
    },
    "GroupingInfo": {
      "type": "object",
      "properties": {
        "sortIndex": {
          "type": "integer",
          "format": "int32",
          "description": "Optional index for sorting the passes when they are grouped with other passes. Passes with lower sort index are shown before passes with higher sort index. If unspecified, the value is assumed to be INT_MAX. For two passes with the same sort index, the sorting behavior is undefined."
        },
        "groupingId": {
          "type": "string",
          "description": "Optional grouping ID for grouping the passes with the same ID visually together. Grouping with different types of passes is allowed."
        }
      }
    },
    "Image": {
      "type": "object",
      "description": "Wrapping type for Google hosted images.",
      "properties": {
        "privateImageId": {
          "type": "string",
          "description": "An ID for an already uploaded private image. Either this or source_uri should be set. Requests setting both or neither will be rejected. Please contact support to use private images."
        },
        "sourceUri": {
          "$ref": "#/$defs/ImageUri"
        },
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#image\"`."
        },
        "contentDescription": {
          "$ref": "#/$defs/LocalizedString"
        }
      }
    },
    "ImageModuleData": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "The ID associated with an image module. This field is here to enable ease of management of image modules."
        },
        "mainImage": {
          "$ref": "#/$defs/Image"
        }
      }
    },
    "ImageUri": {
      "type": "object",
      "properties": {
        "uri": {
          "type": "string",
          "description": "The location of the image. URIs must have a scheme."
        },
        "localizedDescription": {
          "$ref": "#/$defs/LocalizedString"
        },
        "description": {
          "type": "string",
          "description": "Additional information about the image, which is unused and retained only for backward compatibility."
        }
      }
    },
    "InfoModuleData": {
      "type": "object",
      "properties": {
        "labelValueRows": {
          "type": "array",
          "description": "A list of collections of labels and values. These will be displayed one after the other in a singular column.",
          "items": {
            "$ref": "#/$defs/LabelValueRow"
          }
        },
        "showLastUpdateTime": {
          "type": "boolean"
        }
      }
    },
    "LabelValue": {
      "type": "object",
      "description": "A pair of text strings to be displayed in the details view. Note we no longer display LabelValue/LabelValueRow as a table, instead a list of items.",
      "properties": {
        "label": {
          "type": "string",
          "description": "The label for a specific row and column. Recommended maximum is 15 characters for a two-column layout and 30 characters for a one-column layout."
        },
        "localizedLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "localizedValue": {
          "$ref": "#/$defs/LocalizedString"
        },
        "value": {
          "type": "string",
          "description": "The value for a specific row and column. Recommended maximum is 15 characters for a two-column layout and 30 characters for a one-column layout."
        }
      }
    },
    "LabelValueRow": {
      "type": "object",
      "properties": {
        "columns": {
          "type": "array",
          "description": "A list of labels and values. These will be displayed in a singular column, one after the other, not in multiple columns, despite the field name.",
          "items": {
            "$ref": "#/$defs/LabelValue"
          }
        }
      }
    },
    "LatLongPoint": {
      "type": "object",
      "properties": {
        "longitude": {
          "type": "number",
          "format": "double",
          "description": "The longitude specified in the range -180.0 through +180.0, both inclusive. Values outside these bounds will be rejected."
        },
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#latLongPoint\"`."
        },
        "latitude": {
          "type": "number",
          "format": "double",
          "description": "The latitude specified as any value in the range of -90.0 through +90.0, both inclusive. Values outside these bounds will be rejected."
        }
      }
    },
    "LinksModuleData": {
      "type": "object",
      "properties": {
        "uris": {
          "type": "array",
          "description": "The list of URIs.",
          "items": {
            "$ref": "#/$defs/Uri"
          }
        }
      }
    },
    "ListTemplateOverride": {
      "type": "object",
      "properties": {
        "firstRowOption": {
          "$ref": "#/$defs/FirstRowOption"
        },
        "thirdRowOption": {
          "$ref": "#/$defs/FieldSelector"
        },
        "secondRowOption": {
          "$ref": "#/$defs/FieldSelector"
        }
      }
    },
    "LocalizedString": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#localizedString\"`."
        },
        "translatedValues": {
          "type": "array",
          "description": "Contains the translations for the string.",
          "items": {
            "$ref": "#/$defs/TranslatedString"
          }
        },
        "defaultValue": {
          "$ref": "#/$defs/TranslatedString"
        }
      }
    },
    "MerchantLocation": {
      "type": "object",
      "description": "Locations of interest for this class or object. Currently, this location is used for geofenced notifications. When a user is within a set radius of this lat/long, and dwells there, Google will trigger a notification. When a user exits this radius, the notification will be hidden.",
      "properties": {
        "latitude": {
          "type": "number",
          "format": "double",
          "description": "The latitude specified as any value in the range of -90.0 through +90.0, both inclusive. Values outside these bounds will be rejected."
        },
        "longitude": {
          "type": "number",
          "format": "double",
          "description": "The longitude specified in the range -180.0 through +180.0, both inclusive. Values outside these bounds will be rejected."
        }
      }
    },
    "Message": {
      "type": "object",
      "description": "A message that will be displayed with a Valuable",
      "properties": {
        "messageType": {
          "type": "string",
          "description": "The message type.",
          "enum": [
            "MESSAGE_TYPE_UNSPECIFIED",
            "TEXT",
            "text",
            "EXPIRATION_NOTIFICATION",
            "expirationNotification",
            "TEXT_AND_NOTIFY"
          ]
        },
        "body": {
          "type": "string",
          "description": "The message body."
        },
        "id": {
          "type": "string",
          "description": "The ID associated with a message. This field is here to enable ease of management of messages. Notice ID values could possibly duplicate across multiple messages in the same class/instance, and care must be taken to select a reasonable ID for each message."
        },
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#walletObjectMessage\"`."
        },
        "displayInterval": {
          "$ref": "#/$defs/TimeInterval"
        },
        "localizedHeader": {
          "$ref": "#/$defs/LocalizedString"
        },
        "header": {
          "type": "string",
          "description": "The message header."
        },
        "localizedBody": {
          "$ref": "#/$defs/LocalizedString"
        }
      }
    },
    "ModuleViewConstraints": {
      "type": "object",
      "description": "Constraints that all must be met for the module to be shown.",
      "properties": {
        "displayInterval": {
          "$ref": "#/$defs/TimeInterval"
        }
      }
    },
    "Money": {
      "type": "object",
      "properties": {
        "currencyCode": {
          "type": "string",
          "description": "The currency code, such as \"USD\" or \"EUR.\""
        },
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#money\"`."
        },
        "micros": {
          "type": "string",
          "format": "int64",
          "description": "The unit of money amount in micros. For example, $1 USD would be represented as 1000000 micros."
        }
      }
    },
    "PassConstraints": {
      "type": "object",
      "description": "Container for any constraints that may be placed on passes.",
      "properties": {
        "screenshotEligibility": {
          "type": "string",
          "description": "The screenshot eligibility for the pass.",
          "enum": [
            "SCREENSHOT_ELIGIBILITY_UNSPECIFIED",
            "ELIGIBLE",
            "INELIGIBLE"
          ]
        },
        "nfcConstraint": {
          "type": "array",
          "description": "The NFC constraints for the pass.",
          "items": {
            "type": "string",
            "enum": [
              "NFC_CONSTRAINT_UNSPECIFIED",
              "BLOCK_PAYMENT",
              "BLOCK_CLOSED_LOOP_TRANSIT"
            ]
          }
        }
      }
    },
    "PurchaseDetails": {
      "type": "object",
      "properties": {
        "purchaseReceiptNumber": {
          "type": "string",
          "description": "Receipt number/identifier for tracking the ticket purchase via the body that sold the ticket."
        },
        "ticketCost": {
          "$ref": "#/$defs/TicketCost"
        },
        "confirmationCode": {
          "type": "string",
          "description": "The confirmation code for the purchase. This may be the same for multiple different tickets and is used to group tickets together."
        },
        "purchaseDateTime": {
          "type": "string",
          "description": "The purchase date/time of the ticket. This is an ISO 8601 extended format date/time, with or without an offset. Time may be specified up to nanosecond precision. Offsets may be specified with seconds precision (even though offset seconds is not part of ISO 8601). For example: `1985-04-12T23:20:50.52Z` would be 20 minutes and 50.52 seconds after the 23rd hour of April 12th, 1985 in UTC. `1985-04-12T19:20:50.52-04:00` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985, 4 hours before UTC (same instant in time as the above example). If the event were in New York, this would be the equivalent of Eastern Daylight Time (EDT). Remember that offset varies in regions that observe Daylight Saving Time (or Summer Time), depending on the time of the year. `1985-04-12T19:20:50.52` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985 with no offset information. Without offset information, some rich features may not be available."
        },
        "accountId": {
          "type": "string",
          "description": "ID of the account used to purchase the ticket."
        }
      }
    },
    "Review": {
      "type": "object",
      "properties": {
        "comments": {
          "type": "string"
        }
      }
    },
    "RotatingBarcode": {
      "type": "object",
      "properties": {
        "alternateText": {
          "type": "string",
          "description": "An optional text that will override the default text that shows under the barcode. This field is intended for a human readable equivalent of the barcode value, used when the barcode cannot be scanned."
        },
        "showCodeText": {
          "$ref": "#/$defs/LocalizedString"
        },
        "renderEncoding": {
          "type": "string",
          "description": "The render encoding for the barcode. When specified, barcode is rendered in the given encoding. Otherwise best known encoding is chosen by Google.",
          "enum": [
            "RENDER_ENCODING_UNSPECIFIED",
            "UTF_8"
          ]
        },
        "initialRotatingBarcodeValues": {
          "$ref": "#/$defs/RotatingBarcodeValues"
        },
        "type": {
          "type": "string",
          "description": "The type of this barcode.",
          "enum": [
            "BARCODE_TYPE_UNSPECIFIED",
            "AZTEC",
            "aztec",
            "CODE_39",
            "code39",
            "CODE_128",
            "code128",
            "CODABAR",
            "codabar",
            "DATA_MATRIX",
            "dataMatrix",
            "EAN_8",
            "ean8",
            "EAN_13",
            "ean13",
            "EAN13",
            "ITF_14",
            "itf14",
            "PDF_417",
            "pdf417",
            "PDF417",
            "QR_CODE",
            "qrCode",
            "qrcode",
            "UPC_A",
            "upcA",
            "TEXT_ONLY",
            "textOnly"
          ]
        },
        "totpDetails": {
          "$ref": "#/$defs/RotatingBarcodeTotpDetails"
        },
        "valuePattern": {
          "type": "string",
          "description": "String encoded barcode value. This string supports the following substitutions: * {totp_value_n}: Replaced with the TOTP value (see TotpDetails.parameters). * {totp_timestamp_millis}: Replaced with the timestamp (millis since epoch) at which the barcode was generated. * {totp_timestamp_seconds}: Replaced with the timestamp (seconds since epoch) at which the barcode was generated."
        }
      }
    },
    "RotatingBarcodeTotpDetails": {
      "type": "object",
      "description": "Configuration for the time-based OTP substitutions. See https://tools.ietf.org/html/rfc6238",
      "properties": {
        "algorithm": {
          "type": "string",
          "description": "The TOTP algorithm used to generate the OTP.",
          "enum": [
            "TOTP_ALGORITHM_UNSPECIFIED",
            "TOTP_SHA1"
          ]
        },
        "periodMillis": {
          "type": "string",
          "format": "int64",
          "description": "The time interval used for the TOTP value generation, in milliseconds."
        },
        "parameters": {
          "type": "array",
          "description": "The TOTP parameters for each of the {totp_value_*} substitutions. The TotpParameters at index n is used for the {totp_value_n} substitution.",
          "items": {
            "$ref": "#/$defs/RotatingBarcodeTotpDetailsTotpParameters"
          }
        }
      }
    },
    "RotatingBarcodeTotpDetailsTotpParameters": {
      "type": "object",
      "description": "Configuration for the key and value length. See https://www.rfc-editor.org/rfc/rfc4226#section-5.3",
      "properties": {
        "valueLength": {
          "type": "integer",
          "format": "int32",
          "description": "The length of the TOTP value in decimal digits."
        },
        "key": {
          "type": "string",
          "description": "The secret key used for the TOTP value generation, encoded as a Base16 string."
        }
      }
    },
    "RotatingBarcodeValues": {
      "type": "object",
      "description": "A payload containing many barcode values and start date/time.",
      "properties": {
        "values": {
          "type": "array",
          "description": "Required. The values to encode in the barcode. At least one value is required.",
          "items": {
            "type": "string"
          }
        },
        "periodMillis": {
          "type": "string",
          "format": "int64",
          "description": "Required. The amount of time each barcode is valid for."
        },
        "startDateTime": {
          "type": "string",
          "description": "Required. The date/time the first barcode is valid from. Barcodes will be rotated through using period_millis defined on the object's RotatingBarcodeValueInfo. This is an ISO 8601 extended format date/time, with an offset. Time may be specified up to nanosecond precision. Offsets may be specified with seconds precision (even though offset seconds is not part of ISO 8601). For example: `1985-04-12T23:20:50.52Z` would be 20 minutes and 50.52 seconds after the 23rd hour of April 12th, 1985 in UTC. `1985-04-12T19:20:50.52-04:00` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985, 4 hours before UTC (same instant in time as the above example). If the event were in New York, this would be the equivalent of Eastern Daylight Time (EDT). Remember that offset varies in regions that observe Daylight Saving Time (or Summer Time), depending on the time of the year."
        }
      }
    },
    "SaveRestrictions": {
      "type": "object",
      "description": "Defines restrictions on the object that will be verified during save. Note: this is an advanced feature, please contact Google for implementation support.",
      "properties": {
        "restrictToEmailSha256": {
          "type": "string",
          "description": "Restrict the save of the referencing object to the given email address only. This is the hex output of SHA256 sum of the email address, all lowercase and without any notations like \".\" or \"+\", except \"@\". For example, for example@example.com, this value will be 31c5543c1734d25c7206f5fd591525d0295bec6fe84ff82f946a34fe970a1e66 and for Example@example.com, this value will be bc34f262c93ad7122763684ccea6f07fb7f5d8a2d11e60ce15a6f43fe70ce632 If email address of the logged-in user who tries to save this pass does not match with the defined value here, users won't be allowed to save this pass. They will instead be prompted with an error to contact the issuer. This information should be gathered from the user with an explicit consent via Sign in with Google integration https://developers.google.com/identity/authentication. Please contact with support before using Save Restrictions."
        }
      }
    },
    "SecurityAnimation": {
      "type": "object",
      "properties": {
        "animationType": {
          "type": "string",
          "description": "Type of animation.",
          "enum": [
            "ANIMATION_UNSPECIFIED",
            "FOIL_SHIMMER",
            "foilShimmer"
          ]
        }
      }
    },
    "TemplateItem": {
      "type": "object",
      "properties": {
        "predefinedItem": {
          "type": "string",
          "description": "A predefined item to display. Only one of `firstValue` or `predefinedItem` may be set.",
          "enum": [
            "PREDEFINED_ITEM_UNSPECIFIED",
            "FREQUENT_FLYER_PROGRAM_NAME_AND_NUMBER",
            "frequentFlyerProgramNameAndNumber",
            "FLIGHT_NUMBER_AND_OPERATING_FLIGHT_NUMBER",
            "flightNumberAndOperatingFlightNumber"
          ]
        },
        "firstValue": {
          "$ref": "#/$defs/FieldSelector"
        },
        "secondValue": {
          "$ref": "#/$defs/FieldSelector"
        }
      }
    },
    "TextModuleData": {
      "type": "object",
      "description": "Data for Text module. All fields are optional. Header will be displayed if available, different types of bodies will be concatenated if they are defined.",
      "properties": {
        "localizedHeader": {
          "$ref": "#/$defs/LocalizedString"
        },
        "id": {
          "type": "string",
          "description": "The ID associated with a text module. This field is here to enable ease of management of text modules and referencing them in template overrides. The ID should only include alphanumeric characters, '_', or '-'. It can not include dots, as dots are used to separate fields within FieldReference.fieldPaths in template overrides."
        },
        "localizedBody": {
          "$ref": "#/$defs/LocalizedString"
        },
        "body": {
          "type": "string",
          "description": "The body of the Text Module, which is defined as an uninterrupted string. Recommended maximum length is 500 characters to ensure full string is displayed on smaller screens."
        },
        "header": {
          "type": "string",
          "description": "The header of the Text Module. Recommended maximum length is 35 characters to ensure full string is displayed on smaller screens."
        }
      }
    },
    "TicketCost": {
      "type": "object",
      "properties": {
        "faceValue": {
          "$ref": "#/$defs/Money"
        },
        "discountMessage": {
          "$ref": "#/$defs/LocalizedString"
        },
        "purchasePrice": {
          "$ref": "#/$defs/Money"
        }
      }
    },
    "TicketLeg": {
      "type": "object",
      "properties": {
        "destinationStationCode": {
          "type": "string",
          "description": "The destination station code."
        },
        "carriage": {
          "type": "string",
          "description": "The train or ship name/number that the passsenger needs to board."
        },
        "arrivalDateTime": {
          "type": "string",
          "description": "The date/time of arrival. This is an ISO 8601 extended format date/time, with or without an offset. Time may be specified up to nanosecond precision. Offsets may be specified with seconds precision (even though offset seconds is not part of ISO 8601). For example: `1985-04-12T23:20:50.52Z` would be 20 minutes and 50.52 seconds after the 23rd hour of April 12th, 1985 in UTC. `1985-04-12T19:20:50.52-04:00` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985, 4 hours before UTC (same instant in time as the above example). If the event were in New York, this would be the equivalent of Eastern Daylight Time (EDT). Remember that offset varies in regions that observe Daylight Saving Time (or Summer Time), depending on the time of the year. `1985-04-12T19:20:50.52` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985 with no offset information. The portion of the date/time without the offset is considered the \"local date/time\". This should be the local date/time at the destination station. For example, if the event occurs at the 20th hour of June 5th, 2018 at the destination station, the local date/time portion should be `2018-06-05T20:00:00`. If the local date/time at the destination station is 4 hours before UTC, an offset of `-04:00` may be appended. Without offset information, some rich features may not be available."
        },
        "transitTerminusName": {
          "$ref": "#/$defs/LocalizedString"
        },
        "originName": {
          "$ref": "#/$defs/LocalizedString"
        },
        "destinationName": {
          "$ref": "#/$defs/LocalizedString"
        },
        "fareName": {
          "$ref": "#/$defs/LocalizedString"
        },
        "platform": {
          "type": "string",
          "description": "The platform or gate where the passenger can board the carriage."
        },
        "ticketSeat": {
          "$ref": "#/$defs/TicketSeat"
        },
        "transitOperatorName": {
          "$ref": "#/$defs/LocalizedString"
        },
        "departureDateTime": {
          "type": "string",
          "description": "The date/time of departure. This is required if there is no validity time interval set on the transit object. This is an ISO 8601 extended format date/time, with or without an offset. Time may be specified up to nanosecond precision. Offsets may be specified with seconds precision (even though offset seconds is not part of ISO 8601). For example: `1985-04-12T23:20:50.52Z` would be 20 minutes and 50.52 seconds after the 23rd hour of April 12th, 1985 in UTC. `1985-04-12T19:20:50.52-04:00` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985, 4 hours before UTC (same instant in time as the above example). If the event were in New York, this would be the equivalent of Eastern Daylight Time (EDT). Remember that offset varies in regions that observe Daylight Saving Time (or Summer Time), depending on the time of the year. `1985-04-12T19:20:50.52` would be 20 minutes and 50.52 seconds after the 19th hour of April 12th, 1985 with no offset information. The portion of the date/time without the offset is considered the \"local date/time\". This should be the local date/time at the origin station. For example, if the departure occurs at the 20th hour of June 5th, 2018 at the origin station, the local date/time portion should be `2018-06-05T20:00:00`. If the local date/time at the origin station is 4 hours before UTC, an offset of `-04:00` may be appended. Without offset information, some rich features may not be available."
        },
        "ticketSeats": {
          "type": "array",
          "description": "The reserved seat for the passenger(s). If only one seat is to be specified then use the `ticketSeat` field instead. Both `ticketSeat` and `ticketSeats` may not be set.",
          "items": {
            "$ref": "#/$defs/TicketSeat"
          }
        },
        "zone": {
          "type": "string",
          "description": "The zone of boarding within the platform."
        },
        "originStationCode": {
          "type": "string",
          "description": "The origin station code. This is required if `destinationStationCode` is present or if `originName` is not present."
        }
      }
    },
    "TicketRestrictions": {
      "type": "object",
      "properties": {
        "routeRestrictionsDetails": {
          "$ref": "#/$defs/LocalizedString"
        },
        "timeRestrictions": {
          "$ref": "#/$defs/LocalizedString"
        },
        "routeRestrictions": {
          "$ref": "#/$defs/LocalizedString"
        },
        "otherRestrictions": {
          "$ref": "#/$defs/LocalizedString"
        }
      }
    },
    "TicketSeat": {
      "type": "object",
      "properties": {
        "customFareClass": {
          "$ref": "#/$defs/LocalizedString"
        },
        "coach": {
          "type": "string",
          "description": "The identifier of the train car or coach in which the ticketed seat is located. Eg. \"10\""
        },
        "fareClass": {
          "type": "string",
          "description": "The fare class of the ticketed seat.",
          "enum": [
            "FARE_CLASS_UNSPECIFIED",
            "ECONOMY",
            "economy",
            "FIRST",
            "first",
            "BUSINESS",
            "business"
          ]
        },
        "seat": {
          "type": "string",
          "description": "The identifier of where the ticketed seat is located. Eg. \"42\". If there is no specific identifier, use `seatAssigment` instead."
        },
        "seatAssignment": {
          "$ref": "#/$defs/LocalizedString"
        }
      }
    },
    "TimeInterval": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#timeInterval\"`."
        },
        "start": {
          "$ref": "#/$defs/DateTime"
        },
        "end": {
          "$ref": "#/$defs/DateTime"
        }
      }
    },
    "TransitClass": {
      "type": "object",
      "properties": {
        "review": {
          "$ref": "#/$defs/Review"
        },
        "classTemplateInfo": {
          "$ref": "#/$defs/ClassTemplateInfo"
        },
        "wordMark": {
          "$ref": "#/$defs/Image"
        },
        "logo": {
          "$ref": "#/$defs/Image"
        },
        "messages": {
          "type": "array",
          "description": "An array of messages displayed in the app. All users of this object will receive its associated messages. The maximum number of these fields is 10.",
          "items": {
            "$ref": "#/$defs/Message"
          }
        },
        "customPlatformLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "issuerName": {
          "type": "string",
          "description": "Required. The issuer name. Recommended maximum length is 20 characters to ensure full string is displayed on smaller screens."
        },
        "reviewStatus": {
          "type": "string",
          "description": "Required. The status of the class. This field can be set to `draft` or `underReview` using the insert, patch, or update API calls. Once the review state is changed from `draft` it may not be changed back to `draft`. You should keep this field to `draft` when the class is under development. A `draft` class cannot be used to create any object. You should set this field to `underReview` when you believe the class is ready for use. The platform will automatically set this field to `approved` and it can be immediately used to create or migrate objects. When updating an already `approved` class you should keep setting this field to `underReview`.",
          "enum": [
            "REVIEW_STATUS_UNSPECIFIED",
            "UNDER_REVIEW",
            "underReview",
            "APPROVED",
            "approved",
            "REJECTED",
            "rejected",
            "DRAFT",
            "draft"
          ]
        },
        "wideLogo": {
          "$ref": "#/$defs/Image"
        },
        "customFareNameLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "valueAddedModuleData": {
          "type": "array",
          "description": "Optional value added module data. Maximum of fifteen on the class. For a pass only fifteen will be displayed, prioritizing those from the object.",
          "items": {
            "$ref": "#/$defs/ValueAddedModuleData"
          }
        },
        "customConfirmationCodeLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "infoModuleData": {
          "$ref": "#/$defs/InfoModuleData"
        },
        "customConcessionCategoryLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "enableSingleLegItinerary": {
          "type": "boolean",
          "description": "Controls the display of the single-leg itinerary for this class. By default, an itinerary will only display for multi-leg trips."
        },
        "customDiscountMessageLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "notifyPreference": {
          "type": "string",
          "description": "Whether or not field updates to this class should trigger notifications. When set to NOTIFY, we will attempt to trigger a field update notification to users. These notifications will only be sent to users if the field is part of an allowlist. If set to DO_NOT_NOTIFY or NOTIFICATION_SETTINGS_UNSPECIFIED, no notification will be triggered. This setting is ephemeral and needs to be set with each PATCH or UPDATE request, otherwise a notification will not be triggered.",
          "enum": [
            "NOTIFICATION_SETTINGS_FOR_UPDATES_UNSPECIFIED",
            "NOTIFY_ON_UPDATE"
          ]
        },
        "customTimeRestrictionsLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "customCoachLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "transitOperatorName": {
          "$ref": "#/$defs/LocalizedString"
        },
        "merchantLocations": {
          "type": "array",
          "description": "Merchant locations. There is a maximum of ten on the class. Any additional MerchantLocations added beyond the 10 will be rejected. These locations will trigger a notification when a user enters within a Google-set radius of the point. This field replaces the deprecated LatLongPoints.",
          "items": {
            "$ref": "#/$defs/MerchantLocation"
          }
        },
        "customPurchaseReceiptNumberLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "watermark": {
          "$ref": "#/$defs/Image"
        },
        "viewUnlockRequirement": {
          "type": "string",
          "description": "View Unlock Requirement options for the transit ticket.",
          "enum": [
            "VIEW_UNLOCK_REQUIREMENT_UNSPECIFIED",
            "UNLOCK_NOT_REQUIRED",
            "UNLOCK_REQUIRED_TO_VIEW"
          ]
        },
        "imageModulesData": {
          "type": "array",
          "description": "Image module data. The maximum number of these fields displayed is 1 from object level and 1 for class object level.",
          "items": {
            "$ref": "#/$defs/ImageModuleData"
          }
        },
        "textModulesData": {
          "type": "array",
          "description": "Text module data. If text module data is also defined on the class, both will be displayed. The maximum number of these fields displayed is 10 from the object and 10 from the class.",
          "items": {
            "$ref": "#/$defs/TextModuleData"
          }
        },
        "id": {
          "type": "string",
          "description": "Required. The unique identifier for a class. This ID must be unique across all classes from an issuer. This value should follow the format issuer ID. identifier where the former is issued by Google and latter is chosen by you. Your unique identifier should only include alphanumeric characters, '.', '_', or '-'."
        },
        "allowMultipleUsersPerObject": {
          "type": "boolean",
          "description": "Deprecated. Use `multipleDevicesAndHoldersAllowedStatus` instead."
        },
        "customRouteRestrictionsLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "transitType": {
          "type": "string",
          "description": "Required. The type of transit this class represents, such as \"bus\".",
          "enum": [
            "TRANSIT_TYPE_UNSPECIFIED",
            "BUS",
            "bus",
            "RAIL",
            "rail",
            "TRAM",
            "tram",
            "FERRY",
            "ferry",
            "OTHER",
            "other"
          ]
        },
        "languageOverride": {
          "type": "string",
          "description": "If this field is present, transit tickets served to a user's device will always be in this language. Represents the BCP 47 language tag. Example values are \"en-US\", \"en-GB\", \"de\", or \"de-AT\"."
        },
        "locations": {
          "type": "array",
          "description": "Note: This field is currently not supported to trigger geo notifications.",
          "items": {
            "$ref": "#/$defs/LatLongPoint"
          }
        },
        "customTransitTerminusNameLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "activationOptions": {
          "$ref": "#/$defs/ActivationOptions"
        },
        "customPurchaseFaceValueLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "appLinkData": {
          "$ref": "#/$defs/AppLinkData"
        },
        "enableSmartTap": {
          "type": "boolean",
          "description": "Identifies whether this class supports Smart Tap. The `redemptionIssuers` and object level `smartTapRedemptionLevel` fields must also be set up correctly in order for a pass to support Smart Tap."
        },
        "version": {
          "type": "string",
          "format": "int64",
          "description": "Deprecated"
        },
        "customRouteRestrictionsDetailsLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "multipleDevicesAndHoldersAllowedStatus": {
          "type": "string",
          "description": "Identifies whether multiple users and devices will save the same object referencing this class.",
          "enum": [
            "STATUS_UNSPECIFIED",
            "MULTIPLE_HOLDERS",
            "ONE_USER_ALL_DEVICES",
            "ONE_USER_ONE_DEVICE",
            "multipleHolders",
            "oneUserAllDevices",
            "oneUserOneDevice"
          ]
        },
        "redemptionIssuers": {
          "type": "array",
          "description": "Identifies which redemption issuers can redeem the pass over Smart Tap. Redemption issuers are identified by their issuer ID. Redemption issuers must have at least one Smart Tap key configured. The `enableSmartTap` and object level `smartTapRedemptionLevel` fields must also be set up correctly in order for a pass to support Smart Tap.",
          "items": {
            "type": "string",
            "format": "int64"
          }
        },
        "countryCode": {
          "type": "string",
          "description": "Country code used to display the card's country (when the user is not in that country), as well as to display localized content when content is not available in the user's locale."
        },
        "customPurchasePriceLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "securityAnimation": {
          "$ref": "#/$defs/SecurityAnimation"
        },
        "heroImage": {
          "$ref": "#/$defs/Image"
        },
        "customSeatLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "customFareClassLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "linksModuleData": {
          "$ref": "#/$defs/LinksModuleData"
        },
        "customTicketNumberLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "customZoneLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "customCarriageLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "hexBackgroundColor": {
          "type": "string",
          "description": "The background color for the card. If not set the dominant color of the hero image is used, and if no hero image is set, the dominant color of the logo is used. The format is #rrggbb where rrggbb is a hex RGB triplet, such as `#ffcc00`. You can also use the shorthand version of the RGB triplet which is #rgb, such as `#fc0`."
        },
        "homepageUri": {
          "$ref": "#/$defs/Uri"
        },
        "customOtherRestrictionsLabel": {
          "$ref": "#/$defs/LocalizedString"
        },
        "callbackOptions": {
          "$ref": "#/$defs/CallbackOptions"
        },
        "localizedIssuerName": {
          "$ref": "#/$defs/LocalizedString"
        }
      }
    },
    "TranslatedString": {
      "type": "object",
      "properties": {
        "language": {
          "type": "string",
          "description": "Represents the BCP 47 language tag. Example values are \"en-US\", \"en-GB\", \"de\", or \"de-AT\"."
        },
        "value": {
          "type": "string",
          "description": "The UTF-8 encoded translated string."
        },
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#translatedString\"`."
        }
      }
    },
    "Uri": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "description": "Identifies what kind of resource this is. Value: the fixed string `\"walletobjects#uri\"`."
        },
        "id": {
          "type": "string",
          "description": "The ID associated with a uri. This field is here to enable ease of management of uris."
        },
        "localizedDescription": {
          "$ref": "#/$defs/LocalizedString"
        },
        "uri": {
          "type": "string",
          "description": "The location of a web page, image, or other resource. URIs in the `LinksModuleData` module can have different prefixes indicating the type of URI (a link to a web page, a link to a map, a telephone number, or an email address). URIs must have a scheme."
        },
        "description": {
          "type": "string",
          "description": "The URI's title appearing in the app as text. Recommended maximum is 20 characters to ensure full string is displayed on smaller screens. Note that in some contexts this text is not used, such as when `description` is part of an image."
        }
      }
    },
    "ValueAddedModuleData": {
      "type": "object",
      "description": "Data for Value Added module. Required fields are header and uri.",
      "properties": {
        "viewConstraints": {
          "$ref": "#/$defs/ModuleViewConstraints"
        },
        "body": {
          "$ref": "#/$defs/LocalizedString"
        },
        "header": {
          "$ref": "#/$defs/LocalizedString"
        },
        "sortIndex": {
          "type": "integer",
          "format": "int32",
          "description": "The index for sorting the modules. Modules with a lower sort index are shown before modules with a higher sort index. If unspecified, the sort index is assumed to be INT_MAX. For two modules with the same index, the sorting behavior is undefined."
        },
        "image": {
          "$ref": "#/$defs/Image"
        },
        "uri": {
          "type": "string",
          "description": "URI that the module leads to on click. This can be a web link or a deep link as mentioned in https://developer.android.com/training/app-links/deep-linking."
        }
      }
    }
  }
}