WALLET · MULTIPASS
Multipass Wallet Guide
Deliver multiple wallet passes in one SMS/MMS — one API call, one link, every pass
Overview
Multipass issues multiple wallet passes from a single API call and delivers them behind one link in one SMS/MMS. The landing page lists every pass with individual add buttons plus an “Add all” option (Apple multi-pass bundle / Google multi-object save). Use it whenever one transaction produces more than one pass — multi-item orders, family tickets, a card plus its companion offer.
Each pass in the transaction is a fully independent wallet pass: its own barcode, its own personalised fields, its own update/push lifecycle. The single link is a lightweight group that presents them together.
Want a live demo link? Contact support@mobile.digital and we’ll issue a sandbox multipass link to your own phone from your account.
How It Works
- Order is paid on your platform; your fulfilment webhook fires.
- Your handler calls
POST /sendTemplatedEventwith amultipassarray — one item per pass, each carrying its owntag_data(code, PIN, expiry, store, …). - Every item mints a wallet pass from its pass template, personalised with that item’s data. Validation is all-or-nothing: if any item is invalid, nothing is minted and the send is rejected.
- One message goes out via your saved trigger (SMS or MMS, chosen by
event_type). The trigger’s message body must contain the<Add2WalletLink>tag — that is where the single group link is substituted. - The customer taps the link, sees every pass, and adds them individually or all at once.
Prerequisite: a saved trigger in your account whose message body includes
<Add2WalletLink>, and one pass template per product style. Your account manager sets these up with you during onboarding.
Authentication
/sendTemplatedEvent is available on the Basic surface (HTTP Basic auth with your per-merchant credentials) and the Webhook surface (x-api-key header). Use whichever your account was provisioned with — the request body is identical.
Base URL (Basic auth)
https://www.apimobiledigital.com/basic — interactive reference
POST https://i7p1tu3ftd.execute-api.ap-southeast-2.amazonaws.com/prod/sendTemplatedEvent
See the Basic API Guide for credential handling, or the Webhook Guide for the x-api-key surface.
The Request
A complete example — two passes from one transaction, delivered as one SMS:
POST /sendTemplatedEvent
Content-Type: application/json
{
"event_name": "order_pass_issue",
"event_type": "SMS",
"destination": "61400000000",
"tracking_id": "order-84213",
"firstname": "Alex",
"surname": "Smith",
"multipass": [
{
"pass_config_id": "00117",
"tag_data": {
"code": "GC1111222233",
"pin": "1234",
"expiry": "31/12/26",
"storename": "George Street Store",
"amount": "$24.50"
}
},
{
"pass_config_id": "00117",
"tag_data": {
"code": "GC4444555566",
"pin": "5678",
"expiry": "31/12/26",
"storename": "George Street Store",
"amount": "$24.50"
}
}
]
}
One call, one message. Both passes mint; the recipient gets a single SMS whose link opens them together.
Field Reference
Top level
| Field | Required | Notes |
|---|---|---|
event_name | ✓ | Your saved trigger’s name. The trigger owns the message copy, sender ID and channel setup. |
event_type | ✓ | SMS or MMS — selects the delivery channel. |
destination | ✓ | Recipient mobile, international format without + (e.g. 614xxxxxxxx). |
multipass | ✓ | Array of 1–10 pass items (Apple’s one-tap bundle caps at 10). |
tracking_id | recommended | Your order/transaction reference — unique per send. |
firstname, surname, email, … | optional | Recipient-level personalisation. Available to the message copy and used as defaults for every pass. |
Each multipass[] item
| Field | Required | Notes |
|---|---|---|
pass_config_id | ✓* | The pass template for this item. *May be omitted when the trigger’s own pass template applies to every item. |
tag_data.code | per template | The barcode/code value rendered on the pass. |
tag_data.pin | per template | Redemption PIN, shown as a pass field. |
tag_data.expiry | per template | Must be dd/mm/yy (e.g. 31/12/26). Any other format rejects the whole request. |
tag_data.storename, amount, date1, date2, memberid, tier, custom1–3, … | per template | Any field your pass template displays. Item values override the top-level recipient values for that pass. |
Which fields are required? Whatever your pass template references. If a template field has no value the request is rejected with
missing_tags listing exactly what was absent — nothing is partially minted.
Responses & Errors
Success
{
"result": true,
"message": { "status": 1, "message": "SMS has been scheduled", "cost": 1 },
"status": 1,
"transId": "order-84213"
}
Error semantics — the guarantees your integration can rely on
- All-or-nothing validation. Every item’s template and data are checked before anything mints. One bad item (unknown template, missing field, bad expiry) rejects the whole request with per-item detail — you will never get 1 of 2 passes issued.
- No pass-less messages. If the passes cannot be minted, the message is not sent. The failure surfaces in the API response so your retry logic can act on it. (Ordinary single-pass sends behave differently — they strip the tag and send anyway; multipass deliberately does not, because the passes are the payload.)
- Idempotency is yours. Every accepted call mints fresh passes — a retry of a delivered order will issue duplicates. Gate retries on your
tracking_id.
Validation failure example
{
"message": "Invalid Input Data",
"missing_tags": ["code", "amount"]
}
What the Recipient Sees
- One SMS/MMS from your configured sender, with one short link.
- A branded landing page listing every pass in the send, numbered in order, each with a live preview and its own Add to Apple Wallet / Add to Google Wallet button.
- “Add all” — a single tap adds every pass: Apple receives a multi-pass bundle (native one-sheet add), Google receives a multi-object save.
- Passes stay live. Each pass supports later field updates and lock-screen push notifications (balance changes, reminders, offers) — see the Telemetry Guide for the event feed.
Presentation is template-controlled. Pass copy, redemption instructions and the landing-page framing come from the pass template, so each product presents exactly as intended — a stored-value pass as “redeem in store”, a ticket as a ticket, an offer as an offer.
Rules & Limits
| Rule | Detail |
|---|---|
| Max passes per message | 10 (Apple’s one-tap bundle limit). Larger orders: split across sends. |
| Expiry format | dd/mm/yy only. |
| Every send mints new passes | Multipass never reuses previously issued passes — each item is issued fresh. (Membership-style reuse exists for single-pass sends via reuse_existing_pass; it does not apply to multipass.) |
| Channel | event_type SMS or MMS. SMS is priced by message parts; MMS uses your trigger’s media template. |
Testing Checklist
- Confirm your saved trigger’s body contains
<Add2WalletLink>and a pass template is configured. - Send a 2-item
multipassrequest to your own mobile with distinct codes per item. - Verify: one message arrives, one link, the page lists both passes with the right codes/fields.
- Add one pass individually on iPhone and Android; then use Add all and confirm both land in the wallet.
- Send a deliberately broken request (e.g. drop
codefrom one item) and confirm you getmissing_tagsand no message. - Re-send the same order and confirm your
tracking_idgating prevents duplicate issuance.
Questions during integration? support@mobile.digital — include your request payload and
transId.