WalletWallet API
Generate Apple Wallet passes with one API call.
No certificates or complexity. Just JSON in, .pkpass out.
Starting at $0 / month
$0.00019 per pass on Pro
curl -X POST https://api.walletwallet.dev/api/pkpass \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ww_live_<your_key>" \
-d '{
"barcodeValue": "LOYALTY-98765",
"barcodeFormat": "QR",
"title": "Coffee Rewards",
"label": "Member",
"value": "Gold Status",
"colorPreset": "dark",
"expirationDays": 365
}' \
-o rewards.pkpass
Returns a valid .pkpass file ready for Apple Wallet
Why WalletWallet API?
Single Endpoint
One POST request, instant .pkpass file. No multi-step flows.
All Barcode Formats
QR, Code128, PDF417, and Aztec supported out of the box.
Your Branding
Custom colors and logos to match your brand identity.
Auto-Expiration
Set 30, 90, or 365-day expiry to keep wallets tidy.
No Setup Required
We handle Apple certificates. You just send JSON.
Edge Deployed
Running on Cloudflare Workers for fast global response.
Use Cases
Build wallet experiences for any industry
Membership Cards
Gyms, clubs, co-working spaces. Let members check in with a tap.
Event Tickets
Conferences, concerts, sports. Scannable tickets that update in real-time.
Coupons & Loyalty
Retail, restaurants, e-commerce. Drive repeat visits with wallet offers.
API Reference
Everything you need to generate passes
Endpoint
POST https://api.walletwallet.dev/api/pkpass
Authentication
Include your API key in the Authorization header using the Bearer scheme.
Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Authorization | Bearer ww_live_<your_key> |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| barcodeValue | string | Yes | The data encoded in the barcode (e.g., member ID, ticket number) |
| barcodeFormat | string | Yes | One of: QR PDF417 Aztec Code128 |
| title | string | Yes | Pass title displayed on the card |
| label | string | No | Label text above the value field |
| value | string | No | Value text displayed below the label |
| colorPreset | string | No | Color theme: dark light blue green red purple orange |
| color | string | No | Custom hex color (Pro only) e.g., #1e40af |
| logoURL | string | No | URL to custom logo image (Pro only) |
| expirationDays | number | No | Pass expires after 30, 90, or 365 days |
Response
application/vnd.apple.pkpass binary file (save as .pkpass)
Error responses return JSON:
{
"error": "Error message describing the issue"
}
Examples
curl -X POST https://api.walletwallet.dev/api/pkpass \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ww_live_<your_key>" \
-d '{
"barcodeValue": "MEMBER-12345",
"barcodeFormat": "QR",
"title": "Membership Card"
}' \
-o membership.pkpass
curl -X POST https://api.walletwallet.dev/api/pkpass \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ww_live_<your_key>" \
-d '{
"barcodeValue": "LOYALTY-98765",
"barcodeFormat": "QR",
"title": "Coffee Rewards",
"label": "Member",
"value": "Gold Status",
"colorPreset": "dark",
"expirationDays": 365
}' \
-o rewards.pkpass
curl -X POST https://api.walletwallet.dev/api/pkpass \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ww_live_<your_key>" \
-d '{
"barcodeValue": "VIP-001",
"barcodeFormat": "QR",
"title": "VIP Access",
"color": "#8B4513",
"logoURL": "https://example.com/logo.png"
}' \
-o vip.pkpass
const response = await fetch('https://api.walletwallet.dev/api/pkpass', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ww_live_<your_key>'
},
body: JSON.stringify({
barcodeValue: 'TICKET-789',
barcodeFormat: 'QR',
title: 'Event Ticket',
label: 'Seat',
value: 'A-23'
})
});
const blob = await response.blob(); // Save or send to user
import requests
response = requests.post(
'https://api.walletwallet.dev/api/pkpass',
headers={
'Content-Type': 'application/json',
'Authorization': 'Bearer ww_live_<your_key>'
},
json={
'barcodeValue': 'ORDER-456',
'barcodeFormat': 'Code128',
'title': 'Order Pickup',
'label': 'Order #',
'value': '456'
}
)
with open('order.pkpass', 'wb') as f:
f.write(response.content)
Barcode Formats
| Format | Best For |
|---|---|
| QR | General purpose, high data capacity |
| PDF417 | Boarding passes, IDs |
| Aztec | Transit tickets, compact spaces |
| Code128 | Retail, inventory |
Rate Limits
| Plan | Monthly Limit | Custom Colors | Custom Logo |
|---|---|---|---|
| Free | 1,000 | No | No |
| Pro | 100,000 | Yes | Yes |
When you exceed your limit, you'll receive:
{
"error": "Rate limit exceeded. Limit: 1000/month. Resets: 2025-02-01T00:00:00.000Z"
}
Testing Your Pass
- Save the response to a .pkpass file
- On macOS: double-click to preview in Finder
- On iOS: AirDrop or email the file to your device
- The pass will prompt to add to Apple Wallet
Simple Pricing
50x cheaper than the competition
Free
For testing & hobby projects
- 1,000 passes/month
- All barcode formats
- All color presets
- HTTPS endpoint
Pro
For production apps
- 100,000 passes/month
- All barcode formats
- Custom colors & logos
- Webhooks
- Location aware passes
- Priority support
$0.00019 per pass
Need more? Contact us for unlimited pricing.
Ready to get started?
Request your API key today. No credit card required.