Redeem a Transit pass
Stay organized with collections
Save and categorize content based on your preferences.
Passes can be redeemed in the following way:
You can optionally require extra security when users redeem or access their pass. For details,
see Protect with Screen Lock.
Barcode scan
Help your customers scan their Pass by attaching a barcode.
Static barcode
You can display a static barcode by setting object.barcode
.
The API provides a variety of barcode types. For more details, see the
Barcode
type.
Rotating barcode
For additional security, you can display a rotating barcode by setting
object.rotatingBarcode
. Rotating barcodes look just like regular barcodes but
change periodically, typically every minute, and the terminal/reader is programmed to only
accept the most recent one. This reduces the risks associated with barcode screenshotting, in
particular ticket theft or unauthorized ticket resale. For more details, see the
RotatingBarcode
type.
Security animation
Another way to prevent screenshot abuse is by displaying the barcode security animation, which
supports human-verification of a pass.
The physical manifestation of a security animation is a shimmering outline around the barcode of
the pass. This shimmering animation triggers only when the device is in motion so one can test
the pass’ validity by tilting the device. On the other hand holding the device still will only
animate the colorful security animation in loop.
To enable security animation for a pass, in the pass class, set the SecurityAnimation
field’s AnimationType
to FOIL_SHIMMER
.
See Figure 1. below for an example of how the security animation appears when it is enabled:
Figure 1.
Protect with Screen Lock
To protect your customer's access to their Pass, you can require a screen
lock each time they add or access their pass. This can be done by setting class.viewUnlockRequirement
.
For more details, see the
ViewUnlockRequirement
type.
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-09-04 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-04 UTC."],[[["\u003cp\u003ePasses can be redeemed via barcode scan, with options for static or rotating barcodes for added security.\u003c/p\u003e\n"],["\u003cp\u003eRotating barcodes enhance security by changing periodically, minimizing risks associated with ticket theft or resale.\u003c/p\u003e\n"],["\u003cp\u003eSecurity animation provides another layer of protection by displaying a shimmering outline around the barcode, triggered by device motion.\u003c/p\u003e\n"],["\u003cp\u003eScreen lock can be enabled to further protect pass access, requiring user authentication upon adding or accessing the pass.\u003c/p\u003e\n"]]],["Passes can be redeemed via barcode scan. You can use a static barcode by setting `object.barcode` or enhance security with a rotating barcode by setting `object.rotatingBarcode`, which changes periodically. A security animation with a shimmering outline, enabled by setting `SecurityAnimation`'s `AnimationType` to `FOIL_SHIMMER`, can be used to prevent screenshot abuse. Additionally, you can require a screen lock for pass access by setting `class.viewUnlockRequirement`.\n"],null,["# Redeem a Transit pass\n\nPasses can be redeemed in the following way:\n\n- [Barcode scan](#use-show-and-scan).\n\nYou can optionally require extra security when users redeem or access their pass. For details,\nsee [Protect with Screen Lock](#protect-with-screen-lock).\n\nBarcode scan\n------------\n\nHelp your customers scan their Pass by attaching a barcode.\n\n### Static barcode\n\nYou can display a static barcode by setting `object.barcode`.\nThe API provides a variety of barcode types. For more details, see the\n[`Barcode` type](/wallet/tickets/transit-passes/qr-code/rest/v1/Barcode).\n\n### Rotating barcode\n\n\nFor additional security, you can display a rotating barcode by setting\n`object.rotatingBarcode`. Rotating barcodes look just like regular barcodes but\nchange periodically, typically every minute, and the terminal/reader is programmed to only\naccept the most recent one. This reduces the risks associated with barcode screenshotting, in\nparticular ticket theft or unauthorized ticket resale. For more details, see the\n[`RotatingBarcode` type](/wallet/tickets/transit-passes/qr-code/rest/v1/RotatingBarcode).\n\n### Security animation\n\n\nAnother way to prevent screenshot abuse is by displaying the barcode security animation, which\nsupports human-verification of a pass.\n\n\nThe physical manifestation of a security animation is a shimmering outline around the barcode of\nthe pass. This shimmering animation triggers only when the device is in motion so one can test\nthe pass' validity by tilting the device. On the other hand holding the device still will only\nanimate the colorful security animation in loop.\n\n\nTo enable security animation for a pass, in the pass class, set the [`SecurityAnimation`](/wallet/tickets/transit-passes/qr-code/rest/v1/SecurityAnimation)\nfield's [`AnimationType`](/wallet/tickets/transit-passes/qr-code/rest/v1/SecurityAnimation#AnimationType)\nto `FOIL_SHIMMER`.\n\n\nSee Figure 1. below for an example of how the security animation appears when it is enabled:\n\n\n**Figure 1.**\n\nProtect with Screen Lock\n------------------------\n\nTo protect your customer's access to their Pass, you can require a screen\nlock each time they add or access their pass. This can be done by setting `class.viewUnlockRequirement`.\nFor more details, see the\n[`ViewUnlockRequirement` type](/wallet/tickets/transit-passes/qr-code/rest/v1/ViewUnlockRequirement)."]]