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

  1. Order is paid on your platform; your fulfilment webhook fires.
  2. Your handler calls POST /sendTemplatedEvent with a multipass array — one item per pass, each carrying its own tag_data (code, PIN, expiry, store, …).
  3. 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.
  4. 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.
  5. 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

FieldRequiredNotes
event_nameYour saved trigger’s name. The trigger owns the message copy, sender ID and channel setup.
event_typeSMS or MMS — selects the delivery channel.
destinationRecipient mobile, international format without + (e.g. 614xxxxxxxx).
multipassArray of 1–10 pass items (Apple’s one-tap bundle caps at 10).
tracking_idrecommendedYour order/transaction reference — unique per send.
firstname, surname, email, …optionalRecipient-level personalisation. Available to the message copy and used as defaults for every pass.

Each multipass[] item

FieldRequiredNotes
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.codeper templateThe barcode/code value rendered on the pass.
tag_data.pinper templateRedemption PIN, shown as a pass field.
tag_data.expiryper templateMust 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 templateAny 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

  1. One SMS/MMS from your configured sender, with one short link.
  2. 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.
  3. “Add all” — a single tap adds every pass: Apple receives a multi-pass bundle (native one-sheet add), Google receives a multi-object save.
  4. 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

RuleDetail
Max passes per message10 (Apple’s one-tap bundle limit). Larger orders: split across sends.
Expiry formatdd/mm/yy only.
Every send mints new passesMultipass 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.)
Channelevent_type SMS or MMS. SMS is priced by message parts; MMS uses your trigger’s media template.

Testing Checklist

  1. Confirm your saved trigger’s body contains <Add2WalletLink> and a pass template is configured.
  2. Send a 2-item multipass request to your own mobile with distinct codes per item.
  3. Verify: one message arrives, one link, the page lists both passes with the right codes/fields.
  4. Add one pass individually on iPhone and Android; then use Add all and confirm both land in the wallet.
  5. Send a deliberately broken request (e.g. drop code from one item) and confirm you get missing_tags and no message.
  6. Re-send the same order and confirm your tracking_id gating prevents duplicate issuance.
Questions during integration? support@mobile.digital — include your request payload and transId.