Eventlayer / Understand the model
Apple Wallet Templates
Customize the look and feel of Apple Wallet passes for your events and ticket types.
Apple Wallet templates let you customize the appearance of .pkpass files generated for tickets. You can set colors, a logo text, and images for the hero strip, logo, and background.
Templates can be assigned at two levels:
- Event level — Applied to all tickets in the event by default.
- Ticket type level — Overrides the event template for that specific ticket type.
When a pass is generated, the ticket type template merges with the event template: ticket type fields take precedence, and any null fields fall back to the event template values.
Recommended workflow
Create templates from Passes in the dashboard. The visual editor lets you choose colors, upload assets, and inspect a live pass preview before assigning the template.
Use the API when templates are generated from a design system, synchronized across workspaces, or managed by your own administration product.

Template properties
| Property | Type | Description |
|---|---|---|
background_color | string | null | Background color in CSS format (e.g. rgb(60, 60, 60)). |
foreground_color | string | null | Text color in CSS format (e.g. rgb(255, 255, 255)). |
label_color | string | null | Label color in CSS format (e.g. rgb(200, 200, 200)). |
logo_text | string | null | Text displayed next to the pass logo. |
header_text | string | null | Text displayed in the header row of the pass. |
fine_print | string | null | Fine print text shown on the back of the pass. |
sharing_prohibited | boolean | null | Prevents sharing the pass via Wallet's sharing feature. |
grouping_identifier | string | null | Groups related passes together in Wallet. |
show_barcode | boolean | null | Whether the QR code barcode is shown on the pass. Defaults to true. Set to false to hide it. |
The template values are written into the pass JSON during generation.
Apple requires appLaunchURL to be paired with an associated App Store app.
Contact Eventlayer support to enable this integration for your account. If it
is not enabled, Eventlayer safely omits appLaunchURL from the pass.
The response also includes hero_image_url, logo_image_url, and background_image_url. These are read-only: they are set by the image upload endpoint below, not via create or update.
Image types
Images are uploaded as multipart/form-data to POST /v1/apple-wallet-templates/{id}/images (fields: image_type and file). Uploads are validated before storage: formats PNG, JPEG, or WebP, max 10MB, and within the maximum dimensions for the slot.
| Image Type | Pass File | Purpose | Max Dimensions |
|---|---|---|---|
hero | strip.png | Hero image displayed on the pass strip. | 2488 x 840 |
logo | logo.png | Logo image displayed next to the logo text. | 640 x 220 |
background | background.png | Background image behind the pass content. | 2488 x 2160 |
Automating templates with the API
// Create a template
const { data: template, error: templateError } =
await eventlayer.appleWalletTemplates.create({
backgroundColor: "rgb(60, 60, 60)",
foregroundColor: "rgb(255, 255, 255)",
logoText: "Acme Events",
showBarcode: true,
});
if (templateError) throw templateError;
// List templates
const { data: page, error: pageError } =
await eventlayer.appleWalletTemplates.list();
if (pageError) throw pageError;
const { items: templates, meta } = page;
// Or iterate transparently across every page
for await (const {
data: template,
error,
} of eventlayer.appleWalletTemplates.listAll()) {
if (error) throw error;
console.log(template);
}
// Upload an image to a template (multipart: hero, logo, or background)
const { data: updated, error: updatedError } =
await eventlayer.appleWalletTemplates.uploadImage({
templateId: template.id,
imageType: "hero",
file: file,
contentType: "image/png",
});
if (updatedError) throw updatedError;
// Delete an image from a template
await eventlayer.appleWalletTemplates.deleteImage({
templateId: template.id,
imageType: "hero",
});
// Assign template to an event
await eventlayer.events.update({
eventId: "ev_123",
appleWalletTemplateId: template.id,
});
// Override template for a specific ticket type
await eventlayer.ticketTypes.update({
ticketTypeId: "tt_123",
appleWalletTemplateId: template.id,
});
// Remove template assignment (set to null)
await eventlayer.events.update({
eventId: "ev_123",
appleWalletTemplateId: null,
});Images are uploaded directly to the API as multipart/form-data (fields:
image_type and file). Uploads are validated before storage: images must be
PNG, JPEG, or WebP, no larger than 10MB, and within the maximum dimensions for
their slot (hero 2488x840, logo 640x220, background 2488x2160). The stored URL
must be publicly accessible at pass-generation time.
Generating passes
Once a template is assigned to an event or ticket type, all passes generated for that event will use the template's colors and hero image. See the Tickets page for details on generating .pkpass files.
See the Apple Wallet Templates API Reference for full request and response schemas.