Feasibility & API status

Six cards in. The Q1 subset holds.

Feasibility for the unified Expo React Native app. The question per item is not what today's apps do — it is whether an endpoint already exists that the new client can call.

The test is three steps. Does the current mobile app call an endpoint for this? If not, does a PADI web front end? Only if neither is it a gap PADI must close. The existing native apps are evidence, not the subject — they are being replaced.

Most of this scope is reachable with one header pair the app already holds: Authorization: Bearer <idToken> plus affiliate-id. The exceptions are the store and Travel, which live in separate auth realms.

Logged In Experience15 items

Ten of fifteen have an endpoint today — three proven by the current mobile apps, seven by PADI web front ends. None is unconditional. Select a verdict to filter the board.

ItemTitleAPI statusFeasibility
MYP-01Authenticated Dashboard Shell & NavigationGapBuildable section by section; no aggregate
MYP-02Profile — personal information, preferences, view & edit (field-level permissions)Existing — webAll five fields available
MYP-03Certifications & Digital eCard DisplayExisting — mobileBuildable, one auth caveat
MYP-04eLearning Progress SectionGapNot buildable as specified
MYP-05Membership & Billing Section (Club API)Existing — webStatus yes, billing no, purchase blocked
MYP-06Profile image uploadExisting — webBuildable; requirement still ambiguous
MYP-07Email communication preferencesExisting — webBuildable
MYP-08Unified loginExisting — mobileBuildable; multi-realm is the real work
MYP-09Consent / Preference governance and orchestrationGapNot buildable as specified
MYP-10Certification path trackerExisting — webRequirement missing
MYP-11Contact QR code (share diver contact)DeferredOut of Q1 scope
MYP-12Next-course recommendations (personalized)Existing — webBuildable; "personalized" undefined
PREF-01Manage preferred languageExisting — mobileBuildable; propagation is broken
PREF-02Manage contact preferencesExisting — webBuildable
PREF-03Manage privacy and consent optionsGapNot buildable as specified

15 IDs, 13 distinct capabilities. MYP-07/PREF-02 and MYP-09/PREF-03 are each one capability under two identifiers. Estimating all 15 rows separately double-counts two of them. MYP-10 and MYP-12 look like a pair but resolve to different endpoints — separate builds.

The gaps: three hold, one withdrawn

Every gap claim was re-tested against the spec, the live-tested matrix, the web capture and the four repos, on the principle that we cannot call something a gap if PADI already serves it. Three hold. The fourth — membership billing history — is withdrawn to unverified: the endpoint that would carry it is GraphQL, and field absence cannot be asserted without introspecting the schema.

Dashboard aggregation · holds
Proven absent. All five sections have endpoints; nothing composes them — five calls across three auth realms per launch. Axelerant’s BFF to close, not PADI’s.
MYP-01
Consent & privacy systems · holds
Proven absent, searched directly. The only consent machinery in the estate is one china_data_consent key and a Datadog SDK flag. The source names it: “Privacy systems not documented.”
MYP-09, PREF-03
Course completion % · holds
Absent from the mobile apps, the web capture, the live-tested matrix and the spec. One check outstanding: the response body of GET /v2/courses/{packageId}/details has never been read. If a percentage exists anywhere, it is there.
MYP-04
Membership billing history · withdrawn
Downgraded to unverified. POST /pros/graphql is GraphQL and nobody has introspected the schema — absence cannot be asserted from one example query. renewalStatus and autoRenewEnabled are already served, so this item is stronger than first stated.
MYP-05

Two checks stand between this and a defensible gap list, both minutes of work with a valid idToken: introspect pros/graphql, and read GET /v2/courses/{packageId}/details. Until then MYP-05's billing gap should not be put to PADI as a demand.

Identity & Authentication12 items

Only five are in Q1 2027 — and all five are buildable today, none needing a new PADI API. Two of them looked like gaps until it was established that the app already calls AWS Cognito’s API directly, which puts ChangePassword, GlobalSignOut and RevokeToken within reach by a proven path. What PADI owes here is a two-line configuration answer (PADI-11), not development.

ItemTitleAPI statusFeasibility
AUTH-01Global account creation B2CExisting — mobileBuildable
AUTH-02Session management (token refresh, expiry, re-auth)Existing — mobileBuildable; the architecture is the work
AUTH-03Logout / sign outExisting — IdPBuildable; no PADI build required
AUTH-04Password reset / forgot passwordExisting — mobileBuildable
AUTH-05Change passwordExisting — IdPBuildable; no PADI build required
AUTH-06Biometrics, passkeys, MFA, magic links, federated loginGap (partial)Biometric unlock needs no API; four other parts do
AUTH-08Delete / recover accountGapNot buildable; current path is a live exposure
AUTH-09Preferred login methodDeferredPost-Q1; blocked on AUTH-06
AUTH-10GDPR compliance on account creationGapNot buildable as specified
AUTH-11Parent-Signed Waivers for Child ProfilesBlockedPADI Legal sign-off is a stated prerequisite
AUTH-12Age-18 Transition FlowGapPost-Q1; record migration is PADI-side
AUTH-13Global account creation B2BDeferred — endpoints availableOut of Q1 by sequencing, not by capability — the web source has the endpoints

AUTH-07 does not exist — the IDs run 01–06 then 08–13. And no item on this card carries SPK or DEP, where all fifteen in Section 1 carried both: the artefact treats identity as settled. For AUTH-01–05 that is right. For AUTH-06 it hides five features with three different answers, and for AUTH-08 it hides a production defect.

Content pages4 items

All four are confirmed for Q1 2027 by the artefact. Only one is buildable. Every claim here was probed live against the public URLs on 2026-09-10 rather than inferred — legal pages need no auth, so there was no excuse not to.

ItemTitleAPI statusFeasibility
LEGAL-01Privacy PolicyExisting — mobilepadi.com/privacy — probed 200. Buildable today; fix the locale while you are there
LEGAL-02Terms of UseGapThe page does not exist — every candidate path 404s except Travel’s
LEGAL-03Cookie PolicyGapNo page, and cookies are a browser mechanism the app does not use
LEGAL-04Legal & compliance pagesGapThe pages are the easy part; versioning and acceptance records are the requirement

Ten of the app’s twelve languages already have a localised privacy policy live on the webar de es fr it ko nl zh-hans all return 200 at padi.com/{lang}/privacy. The app requests none of them: the URL is hardcoded English. Japanese and Hebrew are the two real holes (both 404), and Japanese is the one language the current client bothers to branch on.

And a diver agreeing to the privacy policy at account creation is clicking a dead linkhref="#" in the consent copy on both the registration and China PIPL screens (INT-7).

Universal Finder6 items

Every one carries PRK — the client has not given direction. That is the right posture for a product decision and the wrong conclusion about feasibility: five of the six are already built and running in production, three of them proven from a PADI mobile app. The card is not waiting on discovery. It is waiting on one question: Drupal or Diviac (SCOPE-18).

ItemTitleAPI statusFeasibility
FIND-01Destinations and Dive guidesExisting — webTwo sources already serve it; the choice is unmade
FIND-02Dive SitesExisting — mobileBuildable — but the mobile endpoint returns only id and name
FIND-03Dive Shop and Dive CentresExisting — webDirectory yes; Salesforce leads and SEO markup are web-only
FIND-04Dive shop & dive site detail pagesExisting — mobileAlready called by PADI Adventures
FIND-05Shop Search & FilteringExisting — mobileMap, proximity, autocomplete and tab-switching all shipped
FIND-06Universal finder — cross-object searchGapSearch exists within object families, not across them

The tension to put to the client. FIND-01/02/03 are scoped as new Drupal 11 content types while a production equivalent — Django, Elasticsearch, place hierarchy, maps, autosuggest — runs on travel.padi.com, and the PADI app’s Dive Shop Locator already links into it. FIND-01’s scope defers that integration to Phase 2 without saying why. That is a build-versus-reuse decision nobody has stated as one.

Identity, Profile & Account6 items

The Q1 2027 Delta lane for this area — six items specified on web and pulled into app scope. The area’s six device-side items, ID-01ID-06, sit in the Post Q1 2027 lane and are not on this card.

ItemTitleAPI statusWhat the unified app can do
PROF-01Preferences — weight, foot size, gearExisting — webBuildable against Travel — but pulls in a second auth realm
AUTH-06Biometrics, passkeys, MFA, magic links, federatedGap (partial)Biometric unlock ships on our own schedule; four parts wait on PADI
AUTH-08Delete / recover accountGapNothing to call — today’s path emails a human
AUTH-10GDPR compliance on account creationGapNo consent platform to record against
AUTH-11Parent-Signed Waivers for Child ProfilesBlockedCannot start — PADI Legal sign-off is a prerequisite
FAM-01Create a child account linked to an adultGapNo parent–child model to write to

Only one of the six is limited by anything the app does. The other five wait on platform PADI has not built or decisions PADI has not taken — so a client-side estimate would price the smallest part of the work, and in three cases work that cannot begin. Three of them converge on one missing substrate: FAM-01 needs a parent–child model, a minor’s account then needs consent (AUTH-10) and a signed waiver (AUTH-11) — and the artefact sequences FAM-01 ahead of the FAM-06 fix it depends on (SCOPE-24).

And one needs no PADI API at all. AUTH-06’s biometric unlock is device capability end to end — the only thing on this card the app can deliver unblocked, currently buried in an item whose other four features are not (SCOPE-11).

PROF-01 is an ownership question, not a build question. Its whole data model — diver sizes with unit handling — already runs on PADI Travel, in a different auth realm, while the PADI apps record no sizes at all. So the app can build the screen cheaply; what it cannot decide is whether doing so commits Q1 to carrying a second token lifecycle (SCOPE-23, SCOPE-7). The same answer settles two post-Q1 items, so it should be taken once.

Certifications & eCard2 items

The Q1 2027 Delta lane for area 02. Its other five items are Post Q1 2027, and two more — MYP-03, MYP-10 — are carried forward and analysed under Logged In Experience. CERT-04 does not exist, the same discontinuity as AUTH-07.

ItemTitleAPI statusWhat the unified app can do
CERT-01Certification history — offline accessPOC-provenBuild it — already working in Expo + Realm against real hosts
CERT-05eCard wallet integration (Apple / Google Wallet)GapOur half is small and unblocked; nothing at PADI signs a pass

CERT-01 is the most de-risked item in this study. It is the area’s only Now flag — confirmed for Q1 — and the offline behaviour is already implemented on the unified app’s own stack: padi-cert-offline-poc is Expo + Realm with a unit-tested reconcile core, archive-not-delete durability and the stale-eCard fix built in. What is left is integration — lift the sync core, pin the field mapping, source a real token. Certifications are read-only, so the app needs a cache here, not a write queue — which is why PLT-01 should be scoped knowing this area consumes only its read half.

CERT-05 is not an engineering problem for the app. Presenting a pass is routine work in Expo RN and the data is already on the device from CERT-01. But a client cannot mint a wallet pass — an .pkpass needs an Apple-issued signing certificate, a Google object a signed JWT from an issuer account — and nothing in eleven web repositories signs one (PADI-25). The IAP flag has a concrete cause too: the eCard purchase link-out is built and commented out at every call site, button hidden — the signature of a store-policy problem the unified app will meet identically, and the same decision PADI-7 has left open since April.

Findings that govern every item

The auth model is settled
One header pair reaches most of this scope: Authorization: Bearer <idToken> plus affiliate-id — the documented default for profile, courses, club, pro, checkpoint, preferences, eCards and membership. The unified app holds it on day one.
all items
One token does not open everything
Three realms, not one session — PADI gateway (idToken), store (commercetools session bridge), Travel (Travel JWT). Sixty-minute expiry and aud must match the target client, so the exchange re-issues per target.
MYP-08, MYP-01
Language does not propagate
Written in three places by three endpoints — Cognito custom:language, preference communicationLanguage, profile languageCommunicationPreference. The app can set a language, not the language.
PREF-01, MYP-02
No aggregate API
Confirmed from both directions. Every dashboard section is its own call. Axelerant owns the BFF layer and can compose — but a BFF can only compose what exists.
MYP-01

One missing system, five items

MYP-09, PREF-03, AUTH-08, AUTH-10 and LEGAL-04 all resolve to the same absent capability — consent capture, policy versioning, acceptance records, data export and erasure. The source says “Privacy systems not documented.” Four separate estimates would be four guesses at one unknown; estimate the platform once (SCOPE-13).

Much of this is already built

Four proofs-of-concept sit in poc/, three of them on the target stack — Expo ~57 / RN 0.86 / React 19. Where one exists it is the strongest evidence in this study, because it settles feasibility independently of whether an endpoint path later changes.

Dive-shop locator
LOCATOR: WORKING · DIVE-SHOP DETAIL + NATIVE COMMERCE: WORKING. Rebuilt against the live Travel APIs, browse unauthenticated. Still open: RADIUS SEARCH and SERVER-SIDE COURSE/CERT FILTERS, both new endpoints (PADI-23).
FIND-03/04/05
eLearning
MY COURSES, COURSE DETAIL, OFFLINE PLAYBACK, PROGRESS/QUIZ COMMIT all WORKING. It renders a 3-state completion badge, not a progress bar — which confirms the MYP-04 gap by construction and proves the reduced form in SCOPE-4 already works.
MYP-04
Pro & Club
MEMBER DASHBOARD: WORKING · NATIVE CLUB (c/club BFF): WORKING. It ran the member GraphQL query and recorded renewalStatus, autoRenewEnabled, memberSince and per-credential expirationDate — narrowing MYP-05 to billing history alone.
MYP-05
Identity
Login, signup, forgot-password and address built in Expo (ADR 0002, plus a recorded walkthrough). It kept the Travel host in a separate config lane rather than unifying it — the three-realm problem showing up in practice.
AUTH-01/02/04
Offline
Two further Expo POCs: resumable course download with Wi-Fi-only and storage control, and certifications as a durable pull-only Realm cache.
CERT-01, PLT-01

Most of this scope is undecided, and that is how to read the verdicts. Of the artefact’s 146 items, 58 are parked and only 26 are confirmed for Q1 2027. Parked items move — paths get renamed, structures change, and PADI-1 says an unknown subset is being rebuilt regardless. So a verdict here is not a claim that a URL survives. It is a claim about capability, resting on what the existing apps and web front ends already do, and on what we have proven ourselves.

The evidence base: web-source

Step 2 of the test used to be answered from a browser capture — the weakest usable class. existing-web-apps/ holds eleven web repositories, so it can now be answered from source, cited to file:line. That has already overturned verdicts on MYP-05, AUTH-11 and AUTH-13.

And it closes PADI-20. The November 2026 front end reads Drupal at {locale}/jsonapi/{path} with no authentication on published content (padi.com/src/shared/services/drupal.ts:19-21). Any content type the web team builds is readable by the unified app, in every language, the day it ships.

No PADI-authored API contract exists

Every "target API" in this study is Axelerant's own discovery — endpoints captured from the browser Network tab and cross-checked against the PadiWW source. Documentation was requested from PADI on 2026-04-24 and asked for again on 2026-07-13. None appears in the corpus. Treat every target endpoint as observed behaviour, not a commitment.