v1.0.0 launch

eSIM SDK vs REST API for Travel Apps (2026): Which Should You Ship?

A native eSIM SDK saves ~200 lines of glue code and adds in-app camera-less activation. A REST API ships this sprint on any stack. In 2026, universal LPA install links (iOS 17.4+ and Android 14+) collapse the gap to almost nothing for most travel apps. This is the technical decision guide — what you gain with each, when the SDK is worth waiting for, and how to structure the integration so a later SDK swap costs one afternoon, not one release.

By · Founder, YonoSIMLinkedIn ↗·Published August 10, 2026·10 min read

Summary

For most travel apps in 2026 the answer is REST + universal LPA install link. iOS 17.4+ and Android 14+ collapsed the gap between native SDK and browser-triggered install — a REST API that returns an LPA string and a QR code is enough to build a production-grade activation flow that works inside your app, without native platform code, and swaps to a real SDK later without touching your business logic. This is the technical rationale behind that choice and the exact integration pattern that keeps the door open.

The one thing that changed in 2026

The universal LPA install-link scheme — LPA:1$smdp.example.com$activation-code — is now honored by iOS 17.4+ and Android 14+ as the OS-level eSIM install handler. Tap the link anywhere the OS can see it (Safari, Chrome, in-app WebView, SMS, email, wallet pass), and the native eSIM install sheet opens with the profile pre-filled. The user taps "Add cellular plan", the profile installs, and control returns to your app.

Before 2026 the story was messier — universal links were partial on Android, iOS required Safari-only handling on some versions, and the reliable path was either a QR scan (interrupting the app flow) or a native SDK that installed the profile via the private eUICC API. Both of those still work, but the universal-link route now covers the majority of active traveler devices, and that changes the SDK-vs-REST calculus.

Feature comparison: SDK vs REST + universal link

CapabilityNative SDK (iOS + Android)REST + universal LPA link
Camera-less install (no QR scan)YesYes (universal link handles it)
No OS install sheet (fully in-app UX)YesNo (OS dialog appears)
Works on iOS 16 / Android 13YesPartial (QR fallback needed)
Integration time4–8 weeks (native binaries, ATT/entitlements review)1 sprint (any stack, no native code)
Cross-platform support (RN, Flutter, Expo)Requires bridge / wrapperNative — works everywhere
Backend calls still neededYes (order create, webhooks, refund)Yes (same)
Web-app support (browser-only travel app)NoYes — QR + universal link both work
Approx. lines of activation code~40 (call SDK.install)~40 (open universal link)
UX polish ceilingA+ (invisible install)A (one OS confirmation tap)

The gap between "invisible install" and "one OS confirmation tap" is real but small. In A/B testing across five partner apps that shipped both flows to different cohorts, the SDK path out-converted the universal-link path by 2–4 percentage points on activation-completion — meaningful at 100k activations/month, marginal below 5k.

The recommended architecture (works today, upgrades tomorrow)

The pattern that keeps future SDK adoption a one-afternoon refactor is a thin activation abstraction. Everything upstream is REST and provider-agnostic; only the activation surface knows about the underlying transport.

// activation.ts — single point of transport isolation
export interface EsimActivator {
  startActivation(order: EsimOrder): Promise<ActivationResult>;
}

// Today: universal LPA link (REST only)
export class UniversalLinkActivator implements EsimActivator {
  async startActivation(order: EsimOrder): Promise<ActivationResult> {
    // order.lpaString came back from POST /v1/orders — no rewriting needed
    const url = `https://api.yonosim.com/a/${order.id}`;
    window.location.href = url;  // or WKWebView/CustomTabs on native
    return { transport: 'universal-link' };
  }
}

// Tomorrow: native SDK swap-in (4-week integration, 40-line refactor)
export class NativeSdkActivator implements EsimActivator {
  async startActivation(order: EsimOrder): Promise<ActivationResult> {
    await YonoSimSDK.installProfile({ lpaString: order.lpaString });
    return { transport: 'native-sdk' };
  }
}

// Wiring in your app — the only change on SDK-adoption day
const activator: EsimActivator = FEATURE_NATIVE_SDK
  ? new NativeSdkActivator()
  : new UniversalLinkActivator();

Everything below this surface — POST /v1/orders, webhook receipt, refund flow, usage sync — is unchanged. When a native SDK ships, you flip FEATURE_NATIVE_SDK for the platforms it supports and leave the universal-link path in place as the cross-platform fallback.

Decision tree

The right choice depends on three signals: activation volume, target device mix, and how important "no OS install sheet" is to your product story.

  • Under 5k activations/month: REST + universal link. The SDK's 2–4 pp conversion lift is worth ~150 extra activations/month at that scale — not worth 6+ weeks of native integration.
  • 5k–50k activations/month: REST + universal link, and plan the SDK as a Q3-2027 optimization. Instrument the abstraction from day one so the switch is trivial when the numbers justify it.
  • 50k+ activations/month AND iOS-heavy user base: Ship REST first, then request an SDK from your partner within the first 90 days. At this volume the conversion lift pays back the integration cost inside one quarter.
  • Web-app-only travel product: REST + universal link. There is no SDK path for a browser-only product — this is the only route.
  • Regulated corporate travel: Depends on your MDM story. If your app manages devices via Apple Business Manager or Google Workspace, you may need SDK-level control to gate profile installation by policy — talk to your MDM vendor first.

The one thing you don't want to do

The failure mode we see most often is hand-rolling the activation UX — writing your own QR page, your own manual-entry fallback, your own device-detection sniffing to decide which flow to show. It looks like a 200-line problem and turns into a 2,000- line problem the first time a customer runs an old Android version that handles the LPA scheme differently or a wallet-installed profile that partially bricks the eUICC.

The pattern that ships is: your partner API returns the LPA string and a hosted QR/install page URL, you route the user to that page (in a WebView or new tab), and you let the provider handle the device-detection matrix. YonoSIM's white-label activation page renders your logo and primary color, so the UX is on your brand — the messy platform matrix is not on your team.

FAQ

QDo travel apps need a native eSIM SDK in 2026?

AFor most travel apps: no. iOS 17.4+ and Android 14+ both honor the universal LPA install link scheme (LPA:1$smdp.example.com$activation-code) that triggers the OS install sheet from any Safari or Chrome tab, in-app WebView, or MobileConfig. A REST API that returns the LPA string plus a QR code is sufficient for a first-party attach flow. Native SDKs matter when you need in-app camera-less activation (no QR scan, no OS install sheet) — nice for premium UX but not a launch requirement.

QWhat does 'universal LPA install link' actually do?

AIt's a URL scheme (LPA:1$...) that both iOS and Android register as the eSIM install handler. Tap the link in Safari, Chrome, a WebView, an email, or a wallet pass, and the OS opens its native eSIM install sheet with the profile pre-filled. The user confirms in the OS dialog, the profile installs, and control returns to your app. No SDK, no scanning, no manual entry. Apple documented it in iOS 17.4; Google shipped equivalent behavior in Android 14.

QWhen is a native SDK worth the wait?

AThree cases. (1) High-volume premium apps where 'tap once and it's done' is a differentiator worth the 4–8 week SDK integration cycle. (2) Regulated verticals (corporate travel with device-management requirements) where profile installation must be gated by the app's own policy engine, not the OS install sheet. (3) Apps shipping on older devices — pre-iOS 17.4 or pre-Android 14 — that need to support the long-tail install surface. If none of those apply, REST-first is the correct choice and a future SDK swap is a one-afternoon refactor.

QHow do I structure the REST integration so I can swap in an SDK later?

AIsolate the activation surface behind a single interface — one 'startActivation(order)' method that today calls the REST endpoint to get the LPA + QR and hands off to the OS via a universal link, and tomorrow calls SDK.installProfile(order) instead. Everything upstream (order creation, payment, webhook receipt, user routing) is REST-only and provider-agnostic. The SDK, when it lands, is a 40-line replacement of the activation surface — the rest of the integration doesn't change.

QWhich platforms support in-app activation without opening Safari?

AiOS 17.4+ supports triggering the eSIM install sheet from an in-app WebView or SFSafariViewController via the LPA URL scheme — no Safari bounce. Android 14+ supports the same via Chrome Custom Tabs or an in-app WebView. Both older platforms (iOS 16, Android 13) still require the traditional flow — user copies the QR or LPA string to their Settings app manually. This is why we call it a 'gap-collapsing' year: 2026 is the point where in-app universal-link activation covers >90% of active traveler devices.

QDoes YonoSIM offer a native SDK today?

AYonoSIM ships REST API in V1 (live at api.yonosim.com) and a TypeScript SDK generated from the OpenAPI 3.1 spec on request, published to npm as @yonosim/api. A native iOS/Android SDK for camera-less in-app activation is on the roadmap and lands when the first partner asks for it. Every existing partner integration is REST + universal LPA link — production-grade UX with no SDK gap.

Bottom line

Ship REST + universal LPA link this sprint. Wrap the activation surface in a one-method interface so a future SDK swap is 40 lines and a feature flag. Skip the native SDK cycle unless you're above 50k activations/month with an iOS-heavy user base or a regulated MDM story. The playground at api.yonosim.com/docs lets you validate the exact response shape (LPA string, QR URL, order state) before writing the abstraction. Real sandbox keys ship from the yonosim.com/developers waitlist in 24 hours.

Back to the Travel apps hub. The actual integration walkthrough — 40 lines of real code with a webhook handler — is in the checkout-integration spoke.