SubKit exposes four surfaces. The right one depends on where your code runs and what it is trusted to do.
- Expo / React Native SDK — Public app-bound SDK key. Render offerings, run purchases, and read entitlements on-device.
- Node.js backend SDK — Server key with scoped capabilities. Create customers, contracts, payments, seats, and check entitlements.
- Runtime API — The HTTP surface the mobile SDK calls: offerings, customer info, entitlement checks, and purchase reconcile.
- Server API — Tenant/app-scoped, capability-gated HTTP surface for trusted backend mutations and reads.
The security boundary
The single most important distinction is which key runs where:
| Surface | Key | Runs in | Can it mutate commerce/access? |
|---|---|---|---|
| Expo SDK | sk_sdk_… |
Mobile app | No — reads and drives purchases |
| Runtime API | sk_sdk_… |
Mobile app | No — verified purchase reconcile |
| Node SDK | sk_srv_… |
Trusted backend | Yes — with explicit capabilities |
| Server API | sk_srv_… |
Trusted backend | Yes — with explicit capabilities |
A common split
Most products use more than one surface together:
- The mobile app uses the Expo SDK to render paywalls and drive purchases.
- The app backend uses the Node SDK to provision contracts, seats, and free/promotional access, and to make server-side access decisions.
- Both ultimately answer the same question through entitlements.