API reference
Webhook events
What each event's data holds. Every delivery is { id, type, createdAt, data }: see Webhooks to check its signature.
pass.created
A pass is created.
From the API, the dashboard or a spreadsheet import. issuer is the set that signed it (platform: the test credentials).
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.created",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "active",
"issuer": "default"
}
}pass.updated
A pass's content changes.
Only when something changed: an update that changes nothing sends nothing. version is its new version, and notified whether installed passes were sent it. A notification adds notification, its message.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.updated",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "active",
"version": 5,
"notified": true,
"notification": "Double points this weekend"
}
}pass.revoked
A pass is revoked.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.revoked",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "revoked"
}
}pass.erased
A revoked pass is deleted permanently.
Its content and holder are gone; only the serial number is kept. reason is requested (you deleted it) or retention (30 days after its revoke).
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.erased",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "erased",
"reason": "retention"
}
}pass.apple.installed
A pass is added to an Apple device.
appleDevices is how many Apple devices it's on now.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.apple.installed",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "active",
"appleDevices": 1
}
}pass.apple.removed
A pass is removed from an Apple device.
reason is unregistered when the holder removes it, or push_token_invalid when Apple says devices no longer have it (devicesRemoved says how many). appleDevices is how many it's still on.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.apple.removed",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "active",
"appleDevices": 0,
"reason": "unregistered"
}
}pass.google.saved
A holder saves a pass to Google Wallet.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.google.saved",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "active"
}
}pass.google.removed
A holder removes a pass from Google Wallet.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "pass.google.removed",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"serialNumber": "9f904677-e06d-4b0f-8404-878ff1066f88",
"externalId": "crm-1042",
"status": "active"
}
}credential.expiring
An Apple certificate is about to expire.
60, 30, 14 and 7 days before an Apple certificate expires. Renew it in the dashboard, under Credentials. Not sent for credentials your organization shares with the workspace.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "credential.expiring",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"issuer": "default",
"provider": "apple",
"identity": "pass.com.example.loyalty",
"expiresAt": "2026-11-07T12:00:00.000Z",
"daysLeft": 30
}
}batch.completed
A spreadsheet import finishes.
A spreadsheet import has finished, with how many rows did what. status is completed, or stopped or cancelled when it ended early, such as when the month's operations ran out.
{
"id": "evt_2f6c9a0d1b7e4c55",
"type": "batch.completed",
"createdAt": "2026-10-08T19:31:12.000Z",
"data": {
"id": "imp_8kq2m4x7",
"status": "completed",
"created": 412,
"updated": 37,
"unchanged": 3,
"failed": 2,
"skipped": 0
}
}Pass events never carry holder details: get the pass by its serialNumber when you need them. Add endpoints and choose their events in the dashboard, under Webhooks.