1a
Start — Potential Diver (non-diver)
Mostly coveredNo certs yet. Profile + intro course + Club prompt.
1Profile data
| Field | API → source |
|---|---|
| Name |
|
| Photo |
|
| Certification status | derived: |
2Featured intro course (Discover Scuba)
| Field | API → source |
|---|---|
| Course image |
|
| Course title |
|
| Course description | not in recommended list — course details or CMS/catalog |
| Course URL | deep-link to learning.padi.com (customCourseId) |
3PADI Club prompt
| Field | API → source |
|---|---|
| Price per year | static / CMS — no join-pricing API found |
| Join PADI Club URL | deep-link (store /subscription/padi-club-membership) |
4Recommended courses (carousel)
| Field | API → source |
|---|---|
| Course image |
|
| Course name |
|
| Course URL | deep-link (customCourseId) |
1b
Enrolled Student
PartialIn-progress course + certification status.
Where the id comes from:
GET /v2/entitlements/{affiliateId}?filter=idc lists every course the user owns — each item carries the packageId. Feed that into /v2/courses/{packageId}/details (title, hero, status, dateStarted); progress uses /v2/courses/{customCourseId}/assessmentresults (customCourseId is the course slug on course objects — confirm it is also returned on the entitlements payload). The affiliateId itself comes from the idToken.1Courses (in progress)
| Field | API → source |
|---|---|
| Course ids — which courses the user owns |
|
| Course name |
|
| Course image |
|
| % completion | derived from |
| Number of sections completed | derived: |
| Last opened time | no “last-accessed” field (details has dateStarted only) — confirm |
2Certification status
| Field | API → source |
|---|---|
| Course name |
|
| Course status |
|
| Course image |
|
1c
Certified / Active Diver
Mostly coveredCert card, keep-learning, membership, specialities, events, badges.
eCard list semantics:
GetAlleCardListPro returns every issued certification eCard for the affiliate — all completed certifications, not just the latest (expired ones, e.g. EFR, included with cardExpirationDate). In-progress courses never appear: a card only exists once certified. Variants: GeteCardListConsumer (consumer accounts), GeteCardTopPro/{n} (latest n cards — handy for this single-card widget), GetAllCardListPro (non-e cards). Certifications without an eCard still show in diveChek.certifications.1Certification card
| Field | API → source |
|---|---|
| Course name (completed cert) |
|
| Diver name | eCard → |
| Certified date | eCard → |
| Diver number | eCard → |
| eCard link & details | eCard → |
| View all certifications | full eCard list / |
2Keep learning
| Field | API → source |
|---|---|
| Course ids (owned, in-progress) |
|
| Course name |
|
| Sections completed |
|
| % completion | derived from |
3Membership
| Field | API → source |
|---|---|
| Status |
|
| Renewal date |
|
| Auto-renew (On/Off) |
|
| Manage membership URL | deep-link |
4Specialities (courses)
| Field | API → source |
|---|---|
| Course image |
|
| Course name |
|
| Filter to “specialties for your level” | no dedicated specialties / cert-level endpoint verified — tag=recommended is generic; a catalog service (…/courses/expanded) exists but its host is env-configured. Confirm with PADI |
| Course details URL | deep-link |
| All courses link | deep-link |
5Events happening nearby
| Field | API → source |
|---|---|
| Event image |
|
| Event name |
|
| Location (city, country) |
|
| Dive store name |
|
| Event link |
|
| View all nearby |
|
6Badges
| Field | API → source |
|---|---|
| Badge name |
|
| Badge image |
|
| Total badges earned | derived: count of |
1d
Keep — Certified / Active Diver
PartialReActivate a deactivated course + certification tile.
1Deactivated course (ReActivate)
| Field | API → source |
|---|---|
| Course image |
|
| Course description | course |
| Link to activate | deep-link (ReActivate flow) |
2Certification
| Field | API → source |
|---|---|
| Certification image | eCard → |
| Certification name | eCard → |
| Status | derived / eCard› |
| View all link | deep-link |
1e
Teach — Pro / Instructor
Mostly coveredMembership, teaching credentials, in-progress certs, badges.
1Membership
| Field | API → source |
|---|---|
| Plan name |
|
| Status |
|
| Auto renew (On/Off) |
|
| Renewal date |
|
2Completed certifications & teaching credentials
| Field | API → source |
|---|---|
| Certification name |
|
| Teaching status (Active/Inactive + year) |
|
| View all link | deep-link |
3Certifications in progress
| Field | API → source |
|---|---|
| Course ids (owned, in-progress) |
|
| Certification name |
|
| Certification description | course |
| % completion | derived from |
| Link to course | deep-link |
4Badges earned
| Field | API → source |
|---|---|
| Badge name |
|
| Badge image |
|
1f
Teach — Dive Shop
PartialDive-shop business view + membership.
pros/graphql is the production API behind PADI’s own pro.padi.com portal — the member query is captured verbatim from its live traffic; storeInfo / renewalHistory field lists come from the pros-app discovery documented in the master reference. Endpoint is live (unauthenticated calls get 401) and its CORS policy already allows the www.padi.com origin, so MyPADI can call it from the browser. storeInfo/memberInfo only resolve for store/pro-affiliated accounts.1Dive shop
| Field | API → source |
|---|---|
| Shop name |
|
| Shop address |
|
| Rating (CDC star) | source TBC — dive-centers.starLabel is the Adventures directory; confirm store rating |
2Membership
| Field | API → source |
|---|---|
| Plan name |
|
| Auto renew status |
|
| Expiry date |
|
| View plan link | deep-link |
1g
EFR — First-aid only user
Mostly coveredSingle EFR certification tile.
1Certification
| Field | API → source |
|---|---|
| Name |
|
| Completed date |
|
| Expiry date |
|
| Renew link | deep-link |
| Find EFR instructor link | deep-link (locator) |
2a
Profile & Identity
Mostly coveredEditable identity + communication preferences — reads and updates.
Two preference systems (consolidation is an open question with PADI): diver preferences —
api.core-prod.padi.com/preference/v1/preference, named category flags (diveAbroad, localDiving, environmentConservation, events, diveCentricTrips, padiCommunications, thirdParty) — and email preferences (SFMC) — prefapi.scubadiving.com/recipient, where preferenceId is numeric (captured ids in the 1001001–1001023 range, status 0/1). Which wireframe toggle maps to which flag / numeric id is still to confirm.1Identity — read
| Field | API → source |
|---|---|
| First name |
|
| Last name |
|
| Date of birth |
|
| |
| Phone |
|
| Address |
|
2Identity — update (form submit)
| Field | API → source |
|---|---|
| Update name / DOB / gender |
|
| Update address |
|
| Update photo |
|
| Communication language | read |
| Change password |
|
| Update email / phone | no verified endpoint — email is the Cognito login (auth-flow change, not in user/update payload); phone has no update path in the captures. Confirm with PADI |
3Communication preferences
| Field | API → source |
|---|---|
| Course tips & learning reminders | SFMC numeric pref via |
| Local dive events near me | diver-preference flags |
| Offers and promotions | diver-preference flags |
| Save toggles — diver preferences |
|
| Save toggles — email prefs (SFMC) |
|
| Unsubscribe (email opt-out) |
|
2b
Certification History
Mostly coveredTeaching credentials + diver certifications.
Per-card “View eCard” links: the eCard API has no single-card fetch — PADI’s own app pulls the full list and filters client-side. Each
eCardInfo[] item carries stable keys (licenseID, eCardStockID, levelID), so the row’s link carries one of these and selects from the already-fetched list — the history table itself renders from the same response, so no extra call is needed (pass the key in the route and re-filter after a refetch). A single-card fetch / server-side filter is already an open ask with PADI (master doc, open question #4).1Teaching credentials
| Field | API → source |
|---|---|
| Credential name |
|
| Issued year |
|
| Status |
|
| View eCard link | select from fetched list by |
2Diver certifications
| Field | API → source |
|---|---|
| Certification name |
|
| Date |
|
| Instructor / shop name |
|
| View eCard link | select from fetched list by |
2c
Purchase History
GapCross-property orders — Store & Purchases.
No API today. There is no order / purchase-history or receipt endpoint, and the storefront is mid-migration — Purchase History can’t be wired yet. Carry it forward and integrate against whatever the new store exposes.
1Orders
| Field | API → source |
|---|---|
| Date | no order-history API today |
| Order number | no order-history API today |
| Items | no order-history API today |
| Total amount | no order-history API today |
| Status | no order-history API today |
| Invoice link (download) | no receipt / invoice API today |
| Filter (Courses / Gear / Membership / All) | depends on the above — no API |
2d
Wallet
PartialSaved payment card(s).
Verified, not assumed:
getcarddata is captured verbatim from pro.padi.com traffic — request and response (array of {brand, expMonth, expYear, last4}, brand lowercase) — and the endpoint is live (unauthenticated calls get 401). The GraphQL paymentDetails query is a documented alternative that adds cardHolderName / cardTypeName. Two confirms remain: no default-card flag exists in either payload, and the capture came from a pro session — confirm the same endpoint serves consumer/Club accounts.1Card
| Field | API → source |
|---|---|
| Card last 4 digits |
|
| Visa / Mastercard |
|
| Is default card? | no flag in getcarddata or paymentDetails — confirm |
| Expiry date |
|
2e
Booked dive trips
Mostly coveredUpcoming & past PADI Travel bookings.
Verified, not assumed:
account/bookings is captured verbatim from travel.padi.com live traffic — the exact request (incl. page / page_size / is_affiliate / is_past params and the Cognito idToken as Bearer) and both response shapes (populated and empty {next, prev, results[], count}). The endpoint is live: unauthenticated calls return 401 (“Authentication credentials were not provided”). One confirm: vacation.status is a numeric code (captured 100) — the code → label mapping needs PADI’s enum.1Upcoming trip
| Field | API → source |
|---|---|
| Image |
|
| Trip name |
|
| Location |
|
| Status |
|
| Trip date & range |
|
| Booking reference |
|
| View details link |
|
2Past trip
| Field | API → source |
|---|---|
| Trip name |
|
| Month & year |
|
| Booking reference |
|
| View link |
|