Back to tools
Free PassKit JSON checker

Pass.json validator

Paste or upload an Apple Wallet pass.json file to check required fields, barcode setup, colors, pass style fields, and common PassKit mistakes.

New Checks iOS 27 poster passes and featured actions

Paste pass.json

PassKit checks built for fast reviews

Use this validator before packaging a .pkpass file or before handing a PassKit build to a customer.

Required Apple Wallet keys
Pass style object detection
Barcode and barcode array checks
RGB color format checks
Relevant date and expiration checks
Field count and location checks
iOS 27 posterGeneric and fallback checks
Featured actions and new barcode formats

Updated for iOS 27

iOS 27 poster passes, featured actions and new barcodes

At WWDC26 Apple added a poster layout for loyalty and membership passes, buttons under the pass, and four barcode formats. This tool checks all of them, and previews a pass the way iOS 27 shows it and the way older iPhones show its fallback.

Poster Generic style

posterGeneric

A full-bleed layout for loyalty and membership cards: artwork behind the whole pass, a primary logo at the top left, one header field, up to four primary fields on a frosted panel, and one footer field. It needs iOS 27, so keep a generic or storeCard dictionary beside it for older iPhones.

Featured actions

featuredActions

Up to two buttons under any pass, such as View Offers and Rewards, Order Delivery or Pickup, Book an Appointment, Call or Go to Location. Each has an identifier, a type and a url. Go to Location takes an Apple Maps place ID in placeIdentifier instead.

Four new barcode formats

PKBarcodeFormatEAN13

EAN-13, Code 39, Codabar and ITF (PKBarcodeFormatEAN13, PKBarcodeFormatCode39, PKBarcodeFormatCodabar, PKBarcodeFormatI2of5). iOS 26 and earlier can't show them, so put a QR or Code 128 entry after them in the barcodes array.

New field groups

additionalInfoFields

additionalInfoFields appear in an Additional Info section below the pass, which suits a list of rewards. footerFields sit at the bottom of the poster, and Wallet only shows the first one.

Poster image sizes

Sizes from Apple's Pass Builder. Wallet scales the artwork to the pass height, which crops roughly 6% off each side, so keep text and stamps away from the edges and out of the area behind the barcode.

File Size @2x px @3x px
artwork.png 358 × 448pt, exact 716 × 896 1074 × 1344
primaryLogo.png Up to 126 × 30pt 252 × 60 378 × 90
secondaryLogo.png Up to 135 × 12pt 270 × 24 405 × 36

A poster pass.json with a fallback

iOS 27 renders posterGeneric. iOS 26 and earlier ignore it, and the featured action, and render the storeCard.

{
  "formatVersion": 1,
  "passTypeIdentifier": "pass.com.example.loyalty",
  "serialNumber": "7f3c9a2e-member-1042",
  "teamIdentifier": "ABCDE12345",
  "organizationName": "Example Cafe",
  "description": "Example Cafe loyalty card",
  "backgroundColor": "rgb(58, 19, 8)",
  "foregroundColor": "rgb(255, 255, 255)",
  "barcodes": [
    { "format": "PKBarcodeFormatQR", "message": "1042", "messageEncoding": "iso-8859-1" }
  ],
  "posterGeneric": {
    "headerFields": [{ "key": "stamps", "label": "Stamps", "value": "6/10" }],
    "primaryFields": [
      { "key": "member", "label": "Member", "value": "Jane Doe" },
      { "key": "next", "label": "Next reward", "value": "4 stamps" }
    ],
    "additionalInfoFields": [
      { "key": "reward", "label": "10 stamps", "value": "Free coffee" }
    ]
  },
  "storeCard": {
    "headerFields": [{ "key": "stamps", "label": "Stamps", "value": "6/10" }],
    "secondaryFields": [
      { "key": "member", "label": "Member", "value": "Jane Doe" },
      { "key": "next", "label": "Next reward", "value": "4 stamps" }
    ]
  },
  "featuredActions": [
    { "identifier": "offers", "type": "viewOffersRewards", "url": "https://example.com/rewards" }
  ]
}

Running a loyalty program?

Get wallet passes like this without writing PassKit code

  • iOS 27 poster passes, with each customer's stamps drawn on the artwork
  • Featured actions such as Go to Location and Book an Appointment
  • A store card fallback for older iPhones, plus Google Wallet
  • Signing, certificates and push updates handled for you
Start free and launch your first card

Free forever plan. No credit card required.

Pass.json validator FAQ

Quick answers about validating Apple Wallet pass.json files.

What does the pass.json validator check?

It checks required PassKit fields, pass style structure, barcode fields, color values, location shape, expiration dates, and common field limits. It also checks the iOS 27 additions: posterGeneric and its fallback style, featuredActions, additionalInfoFields, footerFields, and the EAN-13, Code 39, Codabar and ITF barcode formats.

How do I make an iOS 27 poster pass in pass.json?

Add a posterGeneric dictionary with headerFields, primaryFields and optionally one footerField, and add artwork.png (358 by 448 points) and primaryLogo.png to the package. Keep a generic or storeCard dictionary beside posterGeneric so iPhones on iOS 26 and earlier can still show the pass. Leave logoText out, because the poster has no room for it.

Why does the validator allow two pass styles?

A pass normally has exactly one style. iOS 27 is the exception: posterGeneric sits beside one classic style, which older iPhones render instead. Two classic styles, such as storeCard and generic together, are still an error.

What does a featured action need in pass.json?

Each entry in featuredActions needs a unique identifier, one of Apple's action types such as viewOffersRewards or bookAppointment, and a url. Call takes a tel: URL. Go to Location takes an Apple Maps place ID in placeIdentifier instead of a url. Wallet shows at most two.

Is my pass.json uploaded?

No. Validation runs in your browser, so the JSON you paste or upload stays on your device.

Can this replace Apple's validation tools?

No. Use it as a quick first pass while building or reviewing a wallet pass. Always test the final .pkpass package on Apple Wallet.