Integrate PassQR into your application. All endpoints are available at https://passqr.com
Validate a pass by its QR code. Increments usage count on successful validation.
/api/validate/api/validate?code=PASS-ABC12345valid— Pass is valid, access grantedexpired— Pass has expiredused— Pass already used (max uses reached)revoked— Pass has been revokednot_found— No pass matches the given codecurl -X POST https://passqr.com/api/validate \
-H "Content-Type: application/json" \
-d '{"code": "PASS-ABC12345"}'{
"valid": true,
"status": "valid",
"message": "✅ Access granted",
"pass": {
"code": "PASS-ABC12345",
"holderName": "John Doe",
"holderEmail": "john@example.com",
"templateName": "VIP Membership",
"templateType": "membership",
"usesCount": 1,
"maxUses": null,
"scansRemaining": null
},
"timestamp": "2026-01-15T10:30:00.000Z"
}Generate and download an Apple Wallet (.pkpass) file for a pass. Requires Starter or Pro plan.
/api/wallet/apple?code=PASS-ABC12345200— Returns .pkpass file for download403— Premium feature — upgrade required404— Pass not foundcurl -o pass.pkpass "https://passqr.com/api/wallet/apple?code=PASS-ABC12345"Get a Google Wallet save link for a pass. Requires Starter or Pro plan. Full JWT-based integration coming soon.
/api/wallet/google?code=PASS-ABC12345200— Returns HTML page with save instructions403— Premium feature — upgrade required404— Pass not foundcurl "https://passqr.com/api/wallet/google?code=PASS-ABC12345"Create multiple passes at once for a template. Max 100 passes per request. Requires authentication.
/api/passes/bulk200— Returns array of created pass codes400— Invalid input or limit exceeded401— Unauthorizedcurl -X POST https://passqr.com/api/passes/bulk \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"template_id": "uuid-here",
"passes": [
{ "holder_name": "Alice", "holder_email": "alice@example.com" },
{ "holder_name": "Bob", "holder_email": "bob@example.com", "max_uses": 3 }
]
}'{
"created": [
{ "id": "uuid", "code": "PASS-A1B2C3D4", "holder_name": "Alice", "holder_email": "alice@example.com" },
{ "id": "uuid", "code": "PASS-E5F6G7H8", "holder_name": "Bob", "holder_email": "bob@example.com" }
],
"count": 2
}Send a pass link via email to the holder. Includes QR code and wallet download links.
/api/passes/email/api/passes/email200— Emails sent successfully400— No email address on pass401— Unauthorizedcurl -X POST https://passqr.com/api/passes/email \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"pass_id": "uuid-here"}'Receive real-time notifications when passes are scanned. Set your webhook URL in dashboard settings.
YOUR_WEBHOOK_URL (configured in settings)# Example webhook payload sent to your server:
# POST https://your-server.com/webhook
# Content-Type: application/json
#
# {
# "event": "scan",
# "pass": {
# "code": "PASS-ABC12345",
# "holder": "John Doe",
# "template": "VIP Membership",
# "status": "active"
# },
# "result": "valid",
# "timestamp": "2026-01-15T10:30:00.000Z"
# }{
"event": "scan",
"pass": {
"code": "PASS-ABC12345",
"holder": "John Doe",
"template": "VIP Membership",
"status": "active"
},
"result": "valid",
"timestamp": "2026-01-15T10:30:00.000Z"
}