Skip to main content
PATCH /v1/passes/{id} changes a pass after it was issued. One request can change any of:
  • label: the pass holder display name.
  • variables: the values the pass shows, for example a new seat or a higher tier.
  • templateVersion: the template version the pass renders, to move it to a newer published version after a redesign.
It requires the passes:write scope (access tokens) and works on ISSUED passes only. The response is the changed pass, right away. Passlet then pushes the change to Apple Wallet and Google Wallet in the background, and holders don’t need to do anything. Once the wallets are updated, a pass.updated webhook reports the change.

Update pass data

Send only what changes. variables is merged over the stored values: the variables you send replace their values, and every variable you leave out keeps its current one.
To remove a value, send null: the variable falls back to its template default. A variable without a default needs a value, so removing it fails with 400 (MISSING_REQUIRED_FIELD). The merged variables are validated against the template version the pass renders, the same way as at issue time. A value that doesn’t fit its variable type is rejected with 400 (VALIDATION_ERROR). Values Passlet computes for each pass, such as a generated signed scan code, are read-only: sending one returns 400 (SYSTEM_VARIABLE_READONLY). Every rejected variable is listed in fieldErrors as variables.<name>.

Upgrade the template version

Passes stay pinned to the template version they were issued from; publishing a new version never changes them (see Templates). Every pass shows the version it renders in templateVersion, and the newest published version of its template in latestTemplateVersion. To find all passes of a template that can be upgraded, filter the pass list:
To upgrade a pass, set templateVersion to latest, or to a version number to move it to exactly that version:
The stored variables carry over, and the new version’s defaults fill in the variables the pass has no value for. If the new version adds a variable without a default, the request fails with 400 (MISSING_REQUIRED_FIELD) and names the variable in fieldErrors, for example variables.memberNumber. Send its value in the same request:
To know the required variables up front, GET /v1/templates/{id}/published-version/variables-schema lists the variables of the template’s current published version and marks the required ones. Passes only move forward. A version older than the one the pass renders is rejected with 409 (TEMPLATE_VERSION_NOT_NEWER), and the version it already renders changes nothing. A pass also can’t move to a version that turns off a wallet platform the pass is already issued on (409, CONFLICT).

Preview a change

Add dryRun=true to see a change before you make it. Passlet checks the request exactly as it would for real and returns the pass as the change would leave it, but saves nothing and updates no wallets.
A dry run fails with the same errors as the real request, so it also tells you which variables an upgrade needs.

Revisions

Every change creates a new revision of the pass. The revision field of a pass increases with each one, and it matches the revision number the console shows in the pass history. A request that leaves the pass as it is, for example one that sends the values it already has, creates no revision and doesn’t touch the wallets. That makes retries safe: when you send the same change again, there is nothing left to change.
Pass responses also carry version, which is deprecated. Use revision instead.

Avoid overwriting other changes

When several systems change the same pass, one can overwrite a change it never saw. To prevent that, send the revision your change is based on in the If-Match header. GET /v1/passes/{id} returns it in the ETag response header, and so does every change.
If the pass has changed since, nothing is written and the request fails with 412 (PRECONDITION_FAILED). Fetch the pass again, decide what to change, and send the change with the new revision. Without If-Match, the change applies to the pass as it is.

Errors

See Errors for the error format.