Get Your API Key

Free plan — 1,000 passes/month Pro plan — 100,000 passes/month

Enter your email and we'll send you your API key within 24 hours.

We'll only email you about your API key. No spam.

You're on the list!

We'll send your API key to within 24 hours.

Back to WalletWallet
API Now Available

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

Example Request
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.

Pro

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

200 Returns application/vnd.apple.pkpass binary file (save as .pkpass)
400 Invalid request body or missing required fields
401 Invalid or missing API key
429 Rate limit exceeded
500 Server error

Error responses return JSON:

{
  "error": "Error message describing the issue"
}

Examples

Basic Pass (cURL)
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
Full Example with All Options
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
Pro Plan: Custom Branding
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
JavaScript / Node.js
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
Python
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

  1. Save the response to a .pkpass file
  2. On macOS: double-click to preview in Finder
  3. On iOS: AirDrop or email the file to your device
  4. The pass will prompt to add to Apple Wallet

Simple Pricing

50x cheaper than the competition

Free

For testing & hobby projects

$0 /month
  • 1,000 passes/month
  • All barcode formats
  • All color presets
  • HTTPS endpoint

Pro

For production apps

$19 /month
  • 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.