This documentation is currently under development. Certain sections are not yet complete and will be added shortly.
For the complete documentation index, see llms.txt. This page is also available as Markdown.

Pass

Retrieve passes with optional filtering, sorting, and pagination.

get
/api/{tenantId}/passes

Authorization: Requires Pass.Read scope.

Filtering: By identifiers (e.g., identifiers.email), metadata fields (e.g., metadata.loyaltyTier), pass type, or installation status (apple, google).

Sorting: By id, passType, creationDate, lastUpdateDate, apple, google, or any identifier/metadata field.

Pagination: Zero-based pageIndex and pageSize. Total count in x-pagination-total header.

Use Cases: Search passes by customer attributes; monitor installation status; filter by loyalty tier or campaign flag.

Example — list loyalty passes, page 0:

GET /api/{tenantId}/passes?pageIndex=0&pageSize=20
    &filter[0].field=passType&filter[0].operator=equals&filter[0].value=loyalty
    &sortBy[0].field=creationDate&sortBy[0].direction=DESC

Example — passes installed on Apple Wallet:

GET /api/{tenantId}/passes?filter[0].field=installationStatus&filter[0].operator=contains&filter[0].value=apple
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
pageIndexinteger · int32Optional

Zero-based page index.

Default: 0
pageSizeinteger · int32Optional

Number of passes per page.

Default: 20
Responses
200

Paged list of passes returned successfully.

Represents a pass returned by the API.

idstringOptional

Platform-assigned unique pass identifier. This is a random alphanumeric string generated at creation time and cannot be set by callers (e.g., xK9mP2nQr7sT).

secretstringOptional

Platform-generated opaque token used internally to authenticate pass delivery. Read-only; treat as confidential.

creationDateone ofOptional

Timestamp when the pass was created by the platform. Read-only. Accepts ISO 8601 date-time string or Unix epoch seconds in request inputs. Responses are serialized as ISO 8601 date-time strings.

string · date-timeOptional
or
integer · int64Optional
lastUpdateDateone ofOptional

Timestamp of the most recent update. Equals CreationDate when no update has occurred. Read-only. Accepts ISO 8601 date-time string or Unix epoch seconds in request inputs. Responses are serialized as ISO 8601 date-time strings.

string · date-timeOptional
or
integer · int64Optional
passTypestringOptional

Type of pass, matching a file in the tenant server/passes/ configuration.

get/api/{tenantId}/passes
200

Paged list of passes returned successfully.

Create a new pass.

post
/api/{tenantId}/passes

Authorization: Requires Pass.Write scope OR valid identifier validation (HMAC signature, secret, or allowlisted unsigned).

Security: Each identifier must validate via: (1) HMAC (key.hmac), (2) registered secret (key.secret), (3) security allowlist, or (4) Pass.Write scope. Omit identifiers if JWT contains customer claims.

Pass Type: Template to use. Must match file in tenant server/passes/ config.

Use Cases: API-based pass creation; customer self-service with HMAC; bulk imports.

Example — create with HMAC-signed identifier:

POST /api/{tenantId}/passes?passType=loyalty
            
{
  "identifiers": {
    "shopify.customerId": "12345",
    "shopify.customerId.hmac": "{hmac-of-12345}"
  },
  "additionalData": { "loyaltyTier": "silver" }
}

Example — create with Pass.Write scope (no HMAC required):

POST /api/{tenantId}/passes?passType=loyalty
            
{
  "identifiers": { "shopify.customerId": "12345" },
  "additionalData": { "loyaltyTier": "silver" }
}
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
passTypestringOptional

Type of the pass to create. Must match a file in the tenant server/passes/ configuration.

Body

Data payload for pass creation operations.

additionalDataobject · nullableOptional

Arbitrary data to persist with the pass (for example, loyalty tier, store code, or campaign flags).

extensionsobject · nullableOptional

Extensibility data related to this pass.

Responses
200

Pass created successfully.

stringOptional
post/api/{tenantId}/passes

Update a pass and optionally its type.

patch
/api/{tenantId}/passes

Authorization: Requires Pass.Write scope.

Identification: Use internal id (e.g., id=Ed34kg3oA47) or external identifiers with id. prefix (e.g., id.y2.customerId=1233332). Multiple identifiers must match exactly one pass.

Data: Merged with existing data. Empty/null removes fields; omitted fields unchanged.

Metadata: Set options.UpdateMetadata=true for recomputation (slower). Set options.BypassQueue=true for synchronous updates instead of queueing.

Type: Optionally convert pass to different type.

Use Cases: Update identifiers/metadata; push notifications; type conversion; bulk updates; urgent changes.

Example — update by platform pass ID:

PATCH /api/{tenantId}/passes?id=xK9mP2nQr7sT
            
{
  "additionalData": { "loyaltyTier": "gold" },
  "options": { "updateMetadata": true }
}

Example — update by external identifier:

PATCH /api/{tenantId}/passes?id.shopify.customerId=12345
            
{
  "identifiers": { "email": "[email protected]" },
  "additionalData": { "loyaltyTier": "gold" },
  "options": { "updateMetadata": false }
}
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
passTypestringOptional

type of the pass to update. type name should be one of the file in the server/passes/ tenant configuration.

Body

Data payload for single pass update operations.

additionalDataobject · nullableOptional

Arbitrary data to persist with the pass (for example, loyalty tier, store code, or campaign flags).

passTypestring · nullableOptional

Optional pass type to convert the pass to.

updateMetadatabooleanOptionalDeprecated

Specifies if passes metadata should be updated. Updating metadata is time consuming and could be avoided for notification only push update

Default: false
bypassQueuebooleanOptionalDeprecated

Indicates whether the push update should bypass the queue and run immediately. Queuing helps protect the system load and should only be bypassed when required.

Default: false
Responses
200

Pass update enqueued or applied successfully.

No content

patch/api/{tenantId}/passes

No content

Retrieve the specified pass for the specified device.

get
/api/{tenantId}/passes/{passId}

Download an Apple Wallet pass:

GET /api/{tenantId}/passes/xK9mP2nQr7sT?device=apple

Auto-redirect to the appropriate wallet based on user-agent:

GET /api/{tenantId}/passes/xK9mP2nQr7sT?device=auto

Track the installation source (email campaign, email medium):

GET /api/{tenantId}/passes/xK9mP2nQr7sT?device=apple&neo.src=email-campaign|email
Path parameters
passIdstringRequired

Platform-assigned pass identifier (random alphanumeric string, e.g. xK9mP2nQr7sT).

Pattern: ^[\w-]{5,50}$
tenantIdstringRequired
Query parameters
devicestringOptional

Target platform: apple, google, preview, or auto.

Tagsstring[]Optional

Source tags for categorizing installation source.

MediumstringOptional

Installation medium (e.g., email, sms, app).

OriginstringOptional

Installation origin or referrer.

UserAgentstringOptional

User agent string from the installation request.

Responses
200

OK

No content

get/api/{tenantId}/passes/{passId}
200

OK

No content

Update a pass using its passId.

patch
/api/{tenantId}/passes/{passId}

Authorization: Requires Pass.Write scope.

Identification: Uses the pass's unique passId directly.

Data: Merged with existing data. Empty/null removes fields; omitted fields unchanged.

Metadata: Set options.UpdateMetadata=true for recomputation (slower). Set options.BypassQueue=true for synchronous updates instead of queueing.

Type: Optionally convert pass to different type.

Use Cases: Update passes by internal ID; push notifications; type conversion; urgent changes.

Example — update metadata and push notification:

PATCH /api/{tenantId}/passes/xK9mP2nQr7sT
            
{
  "additionalData": { "loyaltyTier": "platinum", "points": 5000 },
  "options": { "updateMetadata": true, "bypassQueue": false }
}

Example — urgent update, bypass queue:

PATCH /api/{tenantId}/passes/xK9mP2nQr7sT
            
{
  "additionalData": { "boardingStatus": "boarding" },
  "options": { "updateMetadata": true, "bypassQueue": true }
}
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
passIdstringRequired

The unique identifier of the pass to update.

Pattern: ^[\w-]{5,50}$
tenantIdstringRequired
Query parameters
passTypestringOptional

Optional type of the pass to update. Type name should match a file in the server/passes/ tenant configuration.

Body

Data payload for single pass update operations.

additionalDataobject · nullableOptional

Arbitrary data to persist with the pass (for example, loyalty tier, store code, or campaign flags).

passTypestring · nullableOptional

Optional pass type to convert the pass to.

updateMetadatabooleanOptionalDeprecated

Specifies if passes metadata should be updated. Updating metadata is time consuming and could be avoided for notification only push update

Default: false
bypassQueuebooleanOptionalDeprecated

Indicates whether the push update should bypass the queue and run immediately. Queuing helps protect the system load and should only be bypassed when required.

Default: false
Responses
200

Pass update queued or completed successfully.

No content

patch/api/{tenantId}/passes/{passId}

No content

Retrieve a WebSocket URL for pass-level notifications.

get
/api/{tenantId}/passes/{passId}/connect
GET /api/{tenantId}/passes/xK9mP2nQr7sT/connect
            
Path parameters
passIdstringRequired

Platform-assigned pass identifier (random alphanumeric string, e.g. xK9mP2nQr7sT).

Pattern: ^[\w-]{5,50}$
tenantIdstringRequired
Responses
200

WebSocket URL returned successfully.

Represents a Web PubSub connection response for a pass.

urlstringOptional

WebSocket URL to connect for pass notifications.

get/api/{tenantId}/passes/{passId}/connect

Retrieve aggregated pass data from all registered data providers.

get
/api/{tenantId}/passes/{passId}/data
GET /api/{tenantId}/passes/xK9mP2nQr7sT/data
            
Path parameters
passIdstringRequired

Platform-assigned pass identifier (random alphanumeric string, e.g. xK9mP2nQr7sT).

Pattern: ^[\w-]{5,50}$
tenantIdstringRequired
Responses
200

OK

No content

get/api/{tenantId}/passes/{passId}/data
200

OK

No content

Retrieve the raw persisted pass document for diagnostics.

get
/api/{tenantId}/passes/{passId}/data/raw
GET /api/{tenantId}/passes/xK9mP2nQr7sT/data/raw
            
Path parameters
passIdstringRequired

Platform-assigned pass identifier (random alphanumeric string, e.g. xK9mP2nQr7sT).

Pattern: ^[\w-]{5,50}$
tenantIdstringRequired
Responses
200

Raw pass document returned.

No content

get/api/{tenantId}/passes/{passId}/data/raw
200

Raw pass document returned.

No content

Send a notification to the pass identified by its pass identifier

put
/api/{tenantId}/passes/{passId}/notification
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
passIdstringRequired

The internal identifier of the pass

tenantIdstringRequired
Body
contentstring · nullableOptional

Could be null if LocalizedContent is specified

localizedContentobject · nullableOptional

Localized notification content by language code. Key: ISO 639-1 code or "iso2-region" (e.g., "en", "en-US"). Value: The notification content for that language.

Responses
200

OK

No content

put/api/{tenantId}/passes/{passId}/notification

No content

Redirect to a web page that lets the user view and download the pass.

get
/api/{tenantId}/passes/{passId}/view
GET /api/{tenantId}/passes/xK9mP2nQr7sT/view
            
        Additional query parameters are forwarded to the view page.
Path parameters
passIdstringRequired

Platform-assigned pass identifier (random alphanumeric string, e.g. xK9mP2nQr7sT).

tenantIdstringRequired
Responses
302

Found

No content

get/api/{tenantId}/passes/{passId}/view

No content

Retrieve multiple passes for the specified device.

get
/api/{tenantId}/passes/{passIds}

Download a bundle of Apple Wallet passes:

GET /api/{tenantId}/passes/xK9mP2nQr7sT,a3Bc4dEf5gHi?device=apple

Retrieve JSON for Google Wallet:

GET /api/{tenantId}/passes/xK9mP2nQr7sT,a3Bc4dEf5gHi?device=google
Path parameters
passIdsstring[]Required

Collection of pass identifiers with parsing support.

Pattern: ^[\w-]{5,50},([\w-]{5,50},?)+$
tenantIdstringRequired
Query parameters
devicestringOptional

Target platform: apple or google.

Tagsstring[]Optional

Source tags for categorizing installation source.

MediumstringOptional

Installation medium (e.g., email, sms, app).

OriginstringOptional

Installation origin or referrer.

UserAgentstringOptional

User agent string from the installation request.

Responses
200

OK

No content

get/api/{tenantId}/passes/{passIds}
200

OK

No content

Retrieve a Wallet Crew passId from external identifiers.

get
/api/{tenantId}/passes/findPass

Lookup with HMAC-signed identifier:

GET /api/{tenantId}/passes/findPass?shopify.customerId=12345&shopify.customerId.hmac={hmac}

Lookup with Pass.Read scope (no HMAC required):

GET /api/{tenantId}/passes/findPass?shopify.customerId=12345
Path parameters
tenantIdstringRequired
Query parameters
passTypestringOptional

Optional pass type to restrict the search.

Responses
204

No Content

No content

get/api/{tenantId}/passes/findPass

No content

Retrieve passes by direct pass IDs or via a registered supplier.

get
/api/{tenantId}/passes/findPasses

Two Modes:

  • Direct Mode: Pass ids=id1,id2 to look up passes by serial number.

  • Supplier Mode: Pass ids.{provider}={key} (e.g. ids.shopify=ORDER-12345) to resolve pass IDs via a registered Neo.Runtime.Wallet.IPassSupplier. Missing passes are created automatically. Optionally sign the lookup with ids.{provider}.hmac={hmac} or ids.{provider}.secret={secret}.

Preview: When includePreview=true, each item includes title, subtitle, colors, header text, and enabled status.

Use Cases: E-commerce (order → passes); subscriptions (subscription → passes); mobile preview data; loyalty programs (member → passes).

Example — direct pass IDs lookup:

GET /api/{tenantId}/passes/findPasses?ids=xK9mP2nQr7sT,a3Bc4dEf5gHi

Example — resolve via supplier:

GET /api/{tenantId}/passes/findPasses?ids.shopify=ORDER-12345&includePreview=true

Example — resolve via supplier with HMAC:

GET /api/{tenantId}/passes/findPasses?ids.shopify=ORDER-12345&ids.shopify.hmac={hmac}
Path parameters
tenantIdstringRequired
Query parameters
includePreviewbooleanOptional

When true, include preview details (title, subtitle, colors, header text, enabled status) for each pass.

Default: false
Responses
200

Pass list retrieved successfully.

itemsanyOptional
get/api/{tenantId}/passes/findPasses

Send a notification to the corresponding pass

put
/api/{tenantId}/passes/notification
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
Body
contentstring · nullableOptional

Could be null if LocalizedContent is specified

localizedContentobject · nullableOptional

Localized notification content by language code. Key: ISO 639-1 code or "iso2-region" (e.g., "en", "en-US"). Value: The notification content for that language.

Responses
200

OK

No content

put/api/{tenantId}/passes/notification

No content

Push update for passes matching the filter.

post
/api/{tenantId}/passes/pushUpdate

Authorization: Requires Pass.Write scope.

Filtering: Same as GetPasses�identifiers, metadata, pass type, installation status.

Async: Updates are queued. 200 response means scheduled, not complete. Monitor via statistics endpoint.

Data Merge: Merged into each matching pass. Set UpdateMetadata=true for recomputation (slower). Adjust Throughput for concurrency.

Bulk Operations: Ideal for campaigns, loyalty updates, seasonal offers. Use CorrelationId for tracking.

Use Cases: Campaign push; loyalty tier changes; offer refresh; bulk metadata updates.

Example — push a seasonal offer to all loyalty passes:

POST /api/{tenantId}/passes/pushUpdate
    ?filter[0].field=passType&filter[0].operator=equals&filter[0].value=loyalty
            
{
  "additionalData": { "offer": "summer2025", "discount": "20%" },
  "options": {
    "updateMetadata": true,
    "throughput": 12,
    "correlationId": "campaign-summer-2025"
  }
}
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
Body
additionalDataobject · nullableOptional

Arbitrary data to persist with the pass (for example, loyalty tier, store code, or campaign flags).

passTypestring · nullableOptional

Optional pass type to convert the pass to.

updateMetadatabooleanOptionalDeprecated

Specifies if passes metadata should be updated. Updating metadata is time consuming and could be avoided for notification only push update

Default: false
Responses
200

Passes scheduled for update; returns the count in the response body.

Result returned after scheduling a bulk push update operation.

passCountinteger · int32Optional

Count of passes scheduled for update.

post/api/{tenantId}/passes/pushUpdate
200

Passes scheduled for update; returns the count in the response body.

Cancel a running push update operation.

post
/api/{tenantId}/passes/pushUpdate/{correlationId}/cancel

Authorization: Requires Pass.Read scope.

Cancellation: Marks operation for cancellation. May take time if updates already dispatched.

Correlation Id: Use the id from push update schedule or statistics.

Use Cases: Stop campaign on config error; cancel nightly batch; prevent updates on security issue.

Example:

POST /api/{tenantId}/passes/pushUpdate/campaign-summer-2025/cancel
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
correlationIdstringRequired

CorrelationId used when scheduling the push update.

tenantIdstringRequired
Responses
204

Cancellation request accepted.

No content

post/api/{tenantId}/passes/pushUpdate/{correlationId}/cancel
204

Cancellation request accepted.

No content

Retrieve execution statistics for recent push update operations.

get
/api/{tenantId}/passes/pushUpdate/status

Authorization: Requires Pass.Read scope.

Statistics: Operation id, correlationId, start/last activity, pass count, completed count, error count, Apple/Google deployment counts, cancellation status.

Ordering: Sorted descending by start date (most recent first).

Use Cases: Monitor batch progress; track campaign deployment; identify failures; audit history.

Example:

GET /api/{tenantId}/passes/pushUpdate/status
Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Responses
200

Statistics retrieved successfully.

Aggregated status of a push update operation.

idstringOptional

Unique operation identifier.

operationNamestringOptional

Operation name/category.

operationDatastringOptional

Correlation ID for tracking related updates.

startDatestring · date-timeOptional

Operation start timestamp.

lastActivitystring · nullableOptional

Last activity timestamp.

passCountinteger · int32Optional

Total passes scheduled for update.

completedinteger · int32Optional

Number of passes successfully updated.

errorsinteger · int32Optional

Number of passes with update errors.

appleinteger · int32Optional

Number of Apple Pass updates deployed.

googleinteger · int32Optional

Number of Google Pass updates deployed.

isCanceledbooleanOptional

Whether the operation was cancelled.

get/api/{tenantId}/passes/pushUpdate/status
200

Statistics retrieved successfully.

Get pass distribution statistics

get
/api/{tenantId}/passes/stats

Returns aggregated counts of passes by installation status and platform.

Authorization

Requires Pass.Read scope.

Metrics Explained

  • Total: All passes created (regardless of installation)

  • Active: Passes currently installed on at least one device

  • Apple: Passes installed on Apple Wallet

  • Google: Passes installed on Google Wallet

Filtering

Optional passType parameter filters statistics to a specific pass type (e.g., "loyalty", "coupon").

Performance Note

This endpoint queries all passes and may be slow for large datasets. For production dashboards, consider using the Insights API with pre-aggregated queries.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
passTypestringOptional

Optional pass type filter (must match a tenant pass configuration file).

Responses
200

OK

Get statistics about pass usage

get/api/{tenantId}/passes/stats
200

OK

Last updated