Passinstance Developer Documentation
Build high-volume Apple Wallet (.pkpass) and Google Wallet integrations. Issue, update, scan, and broadcast real-time lockscreen notifications via production-grade REST APIs.
Issue your first Wallet pass in 30 seconds
Create, cryptographically sign, and distribute Apple Wallet & Google Wallet passes with one API call.
curl -X POST https://api.passinstance.com/api/v1/passes \
-H "Authorization: Bearer $PASSINSTANCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateId": "tpl_loyalty_artisan",
"serialNumber": "MEMBER-88219",
"recipient": {
"name": "Alex Morgan",
"email": "alex@customer.com"
},
"customFields": {
"stamps": 3,
"tier": "Silver"
}
}'Getting Started & Base URLs
The Passinstance API enables developers to dynamically issue, distribute, update, and validate digital passes for Apple Wallet (iOS) and Google Wallet (Android). All API requests must be made over HTTPS and return a standardized ApiResponseDto envelope with machine-readable status codes.
https://api.passinstance.com/api/v1https://staging-api.passinstance.com/api/v1application/json (UTF-8) with ApiResponseDto<T> envelopeEurope/Berlin (ISO 8601 timestamps)Architecture & Pass Lifecycle
Pass management follows a 5-stage lifecycle: 1. Template (visual blueprint) → 2. Pass (cryptographically signed record) → 3. Distribution (secure passAccessUrl) → 4. Wallet Registration (device enrolls with APNs / Google Push) → 5. Live Updates (real-time lockscreen notifications).
Master layout, barcode type, branding colors, and schema fieldsSigned digital pass containing member data and unique serial numberHTTPS web landing page for adding pass into Apple or Google WalletDevice registers push token; pass is actively installed on deviceServer broadcasts background APNs / Google push on state changeQuick Start: 5-Minute Pass Issuance
Create your first usable pass in under 5 minutes. Set your API key header, call POST /api/v1/passes with a valid templateId, and deliver the returned passAccessUrl to your end-user.
export PASSINSTANCE_API_KEY="pi_test_..."POST /api/v1/passes with templateId and serialNumberExtract response.data.passAccessUrl from 201 Created payloadDeliver URL via SMS/Email; user taps "Add to Apple/Google Wallet"Apple Wallet vs. Google Wallet Matrix
Passinstance automatically signs .pkpass bundles for iOS and generates signed JWT objects for Google Wallet. Assets, barcodes, and lockscreen triggers adapt seamlessly across both operating systems.
Cryptographic PKCS#7 signature using Apple Pass Type ID certificateGoogle Cloud Service Account REST JWT payloadApple: 375×123 px (3:1) | Google: 1032×336 px (approx 3:1)QR Code and PDF417 supported natively on both mobile platformsAuthentication & Environment Keys
All API calls require authentication via secret API keys passed in the Authorization header. Never expose secret API keys in client-side mobile apps or browser code.
Authorization: Bearer pi_live_xxxxxxxxxxxxxxxxxxxxxxxxAuthorization: Bearer pi_test_xxxxxxxxxxxxxxxxxxxxxxxxx-scanner-key: scan_key_77a8b9c0d1e2f3a4...Server-to-server calls only. Disallow frontend bundle inclusion.Error Handling & Rate Limits
Every API response uses the canonical ApiResponseDto envelope. Client errors (4xx) should be fixed before retrying; server errors (5xx) and rate limits (429) should be retried with exponential backoff.
{ "success": true, "data": { ... }, "errors": [], "statusCode": 200 }{ "success": false, "data": null, "errors": ["Validation failed"], "statusCode": 400 }{ "success": false, "data": null, "errors": ["Serial number already exists"], "statusCode": 409 }100 req/sec limit. Check Retry-After response header before retrying.Webhook HMAC Signature Verification
Passinstance signs all outbound webhook deliveries using HMAC-SHA256. Verify the X-Passinstance-Signature header using your subscription secret to prevent spoofing and replay attacks.
X-Passinstance-Signature: t=1755811200,v1=9f8e7d6c5b4a3...Reject webhook deliveries with timestamps older than 5 minutes (300s)PASS_CREATED, PASS_UPDATED, PASS_SCANNED, PASS_INSTALLED, PASS_UNINSTALLEDReturn HTTP 200 OK within 5,000ms to acknowledge receiptOfficial SDKs & Client Libraries
Official thin SDKs providing end-to-end TypeScript interfaces, automatic token caching, exponential backoff retries, and cryptographic webhook signature validation.
npm install @passinstance/nodepip install passinstancecomposer require passinstance/passinstance-phpcurl -X POST https://api.passinstance.com/api/v1/passes \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" \
-d '{
"templateId": "tpl_8f2a1e0b-3c4d-4e5f-9a1b-2c3d4e5f6a7b",
"serialNumber": "MEMBER-2024-8891",
"name": "Acme VIP Customer Pass",
"organizationName": "Acme Rewards",
"backgroundColor": "#1b2d3c",
"foregroundColor": "#ffffff",
"labelColor": "#7db4f0",
"barcode": {
"value": "PI-8891-JD-VIP",
"alternativeText": "8891-VIP"
},
"images": {
"icon": "https://assets.passinstance.com/media/icon.png",
"logo": "https://assets.passinstance.com/media/logo.png",
"strip": "https://assets.passinstance.com/media/strip.png"
},
"relevantDate": "2026-08-25T18:00:00.000Z"
}'{
"success": true,
"data": {
"id": "pass_9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"templateId": "tpl_8f2a1e0b-3c4d-4e5f-9a1b-2c3d4e5f6a7b",
"serialNumber": "MEMBER-2024-8891",
"name": "Acme VIP Customer Pass",
"organizationName": "Acme Rewards",
"backgroundColor": "#1b2d3c",
"foregroundColor": "#ffffff",
"labelColor": "#7db4f0",
"barcode": {
"value": "PI-8891-JD-VIP",
"alternativeText": "8891-VIP"
},
"images": {
"icon": "https://assets.passinstance.com/media/icon.png",
"logo": "https://assets.passinstance.com/media/logo.png",
"strip": "https://assets.passinstance.com/media/strip.png"
},
"relevantDate": "2026-08-25T18:00:00.000Z",
"status": "ACTIVE",
"voided": false,
"downloadUrl": "https://passinstance.com/p/pass_9a8b7c6d",
"passAccessUrl": "https://passinstance.com/p/pass_9a8b7c6d",
"createdAt": "2026-08-21T20:30:00.000Z",
"updatedAt": "2026-08-21T20:30:00.000Z"
},
"description": "Pass created successfully",
"errors": [],
"statusCode": 201
}ApiResponseDto<T>HTTPS (TLS 1.3)