Skip to main content

Transit tickets in Apple Wallet and Google Wallet

When you sell travel, your customer needs one thing: the right ticket, at the right time, without stress. eldo wallet puts the ticket in Apple Wallet or Google Wallet on their phone at booking. It works offline, shows up on the lock screen on departure day and updates itself when the schedule changes.

Try this pass liveFill in the form, watch the pass and the code update, then get it on your phone.

Customer journey​

Integration workflow​

  1. Create the route templateBack office

    A transit template holds what all tickets on a route share: type (Bus, Train, Tram, Boat, Air, Generic), stations and codes, reference times, fare, terms, customer service number, colors, strip and barcode format. Create it once, in the back-office or through the API. The wallet must have the TRANSIT pass type enabled.

    POST/transitsTry it
    curl -L 'https://api-v2.test.eldowallet.fr/transits' \
    -H 'Accept: application/json' \
    -H 'x-lang: en' \
    -H 'Authorization: Bearer <token>' \
    -F 'strip=@"banner.png"' \
    -F 'type="Bus"' \
    -F 'number="147"' \
    -F 'originStationCode="MLH"' \
    -F 'originName="Mulhouse"' \
    -F 'destinationStationCode="GVA"' \
    -F 'destinationName="Geneva"' \
    -F 'departureTime="09:30"' \
    -F 'arrivalTime="12:15"' \
    -F 'details="Please arrive 15 minutes before departure."' \
    -F 'terms="Named ticket, exchangeable until the day before."' \
    -F 'barcodeFormat="QR_CODE"' \
    -F 'colors="{\"backgroundColor\":\"\#0f3d5e\",\"labelColor\":\"\#9ee00d\",\"foregroundColor\":\"\#ffffff\"}"' \
    -F 'security="{\"enableOneTimeUse\":true,\"disableIOSPassSharing\":true}"'
  2. The traveller booksEnd customer

    On your website, app, at the counter or through a reseller. Your ticketing system records the sale, then calls eldo wallet.

  3. Issue the ticketYour server

    One call per traveller, with their contact details, dates, barcode and above all the tripNumber. This number groups every ticket on the same service: it's what makes bulk updates possible.

    Two delivery options:

    • enableSendEmailOrSms: true: eldo wallet sends the email or SMS with the "Add to Wallet" button.
    • enableSendEmailOrSms: false: you take the link from the response and share it yourself (confirmation email, app, QR code on a travel-agency ticket or a kiosk).
    POST/transits/{transitId}/passesTry it
    curl -L 'https://api-v2.test.eldowallet.fr/transits/$TRANSIT_ID/passes' \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    -H 'x-lang: en' \
    -H 'Authorization: Bearer <token>' \
    --data-raw '{
    "firstName": "Loïc",
    "lastName": "Bernard",
    "email": "loic.bernard@example.com",
    "departureDate": "2026-11-12",
    "arrivalDate": "2026-11-12",
    "departureTime": "09:30",
    "arrivalTime": "12:15",
    "tripNumber": "MLH-GVA-20261112-0930",
    "seat": "14",
    "barcode": "TR-2026-000123",
    "expirationDate": "2026-11-13T00:00:00.000Z",
    "enableSendEmailOrSms": true
    }'
  4. Issue in bulkYour server

    School groups, company outings, charters: send up to 5,000 tickets in one request. The operation runs asynchronously. Track its status by ID, or pass a webhookUrl to be notified when it's done.

  5. Announce a delay or a changeYour server

    One call updates every ticket on the trip (times, stations, dates). To explain why ("30 min delay, weather"), also send a message to the tripNumber holders. Full guide: Update a trip.

    PATCH/transits/{transitId}/passes/trip/{tripNumber}Try it
    curl -L -X PATCH 'https://api-v2.test.eldowallet.fr/transits/$TRANSIT_ID/passes/trip/MLH-GVA-20261112-0930' \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    -H 'x-lang: en' \
    -H 'Authorization: Bearer <token>' \
    -d '{
    "departureTime": "09:00",
    "arrivalTime": "11:45"
    }'
    POST/transits/{transitId}/passes/trip/{tripNumber}/notifyTry it
    curl -L 'https://api-v2.test.eldowallet.fr/transits/$TRANSIT_ID/passes/trip/MLH-GVA-20261112-0930/notify' \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    -H 'x-lang: en' \
    -H 'Authorization: Bearer <token>' \
    -d '{
    "message": "Your departure has moved to 09:00."
    }'
  6. Fix a single ticketYour server

    New date for one traveller, new seat, typo in the name: update their ticket without touching the others. Several fixes at once: use the bulk update.

  7. Validate at boardingYour server

    The inspector scans the barcode. Your terminal looks up the ticket, then redeems it. A second scan is rejected. Turn on one-time use on the template to block a second boarding.

  8. Track issued ticketsYour server

    List the tickets issued per route (page and limit pagination) and follow stats by route, type and period.

  9. Reward frequent travellersYour server

    Add a traveller card: a trip counter on the loyalty card, and a "free trip" coupon on the 5th journey.

Best practices​

  • The tripNumber is essential in practice. Without it, you'll have to update each ticket one by one when a delay hits.
  • Set an expiry date. The ticket expires after the trip and stays in the wallet history as a receipt.
  • Separate data and message. Update the time with one call, explain the reason with another. Travellers understand what changed and why.
  • Dates as YYYY-MM-DD, times as HH:mm. If you change a trip's departure date, send the arrival date too.
  • Guard against sharing. The template's security options (one-time use, iOS sharing off, rotating barcode) limit resale and screenshots.

Go further​

Get inspired​

The ticket is only the start of the journey. Here are ideas to look after your travellers and bring them back.

The day-before reminderThe day before departure: time, station, baggage allowance and recommended travel time. The traveller leaves stress-free.
Park-and-ride includedThe ticket comes with a park-and-ride ticket at the departure station. The traveller parks and boards without queuing.
New route, first travellersOpening a new route? Regular travellers in the area hear about it first, with a launch code.
Traveller on a breakNo trip in 90 days: a targeted offer lands in the Wallet to spark the next journey.
More comfort, one tap awayThe day before departure, offer a roomier seat, an extra bag or on-board Wi-Fi. Extra revenue, effortlessly.
Pass renewalA week before a monthly pass or youth card runs out, a reminder with the renewal link.
Deals at destinationOn arrival, an offer from a local partner: museum, restaurant, bike rental. The trip goes on with you.
CO₂ savedOn the back of the ticket, the CO₂ saved compared with driving, and the yearly total for regulars. A strong message, and zero paper.

Like one of these ideas? Contact our team and we'll show you how to set it up.

API news, once a month

New endpoints, upcoming changes, guides and use cases. No spam, one-click unsubscribe.

Report a technical problem

An API error, a pass that does not update, an email that does not arrive? Describe the problem: our technical team will answer.

For a fast answer, include:

  • The method and endpoint (e.g. POST /clients)
  • The error code returned (errorCode) and the body sent
  • The date and time of the call
  • The identifiers involved (customer, template, pass)

Never include an API token or a password.

AI assistant

Beta

Loading…

AI-generated answers (Claude): double-check important details.

Sign in to use the assistant