Skip to Content
API ReferenceOnboarding

Onboarding

Setelah register, user wajib menyelesaikan onboarding sebelum bisa menggunakan fitur utama. Onboarding terdiri dari 3 step dengan beberapa sub-step.

Alur Onboarding

Step 1 β€” Profile Setup (9 sub-steps): 0: Community Rules β†’ Accept rules 1: Welcome β†’ Welcome screen (no data) 2: Name β†’ Input nama 3: Gender β†’ Pilih MALE / FEMALE 4: Birthday β†’ Input tanggal lahir 5: Body Basics β†’ Tinggi/berat badan (opsional) 6: Photos β†’ Upload foto profil (min 2, maks 6) 7: Bio β†’ Input bio singkat (opsional) 8: Location β†’ Pilih negara, provinsi, kota Step 2 β€” Preferences (5 sub-steps): 0: Transition β†’ Screen transisi 1: Motivations β†’ Pilih motivasi (dynamic dari DB) 2: Sports β†’ Pilih olahraga favorit (dynamic dari DB) 3: Activity Style β†’ Pilih gaya aktivitas (dynamic dari DB) 4: Availability β†’ Pilih ketersediaan (dynamic dari DB) Step 3 β€” Permissions (3 sub-steps): 0: Transition β†’ Screen transisi 1: Location Permission β†’ Aktifkan geolokasi 2: Notifications β†’ Aktifkan push notification β†’ Selesai

GET /onboarding/status

Cek status onboarding dan data yang sudah disimpan (untuk resume).

Memerlukan JWT authentication.

Contoh Request

curl -X GET https://fumai.app/api/mobile/v1/onboarding/status \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const res = await fetch('https://fumai.app/api/mobile/v1/onboarding/status', { headers: { Authorization: `Bearer ${accessToken}` }, }) const data = await res.json()

Response 200

{ "success": true, "data": { "isCompleted": false, "currentStep": 1, "currentSubStep": 3, "completedAt": null, "skippedAt": null, "profile": { "name": "John Doe", "gender": "MALE", "birthDate": "1995-06-15", "height": 175, "heightUnit": "cm", "weight": 70, "weightUnit": "kg", "photos": ["https://..."], "bio": "Fitness enthusiast", "communityRulesAccepted": true, "countryId": "clx...", "regionId": "clx...", "cityId": "clx...", "locale": "id", "timezone": "Asia/Jakarta", "avatarUrl": "https://...", "motivations": [], "favoriteSports": [], "activityStyle": [], "preferredAvailability": [] } } }

Response Fields

FieldTipeKeterangan
isCompletedbooleantrue jika semua step selesai
currentStepnumberStep terakhir selesai (0-3). 0=belum mulai, 1=profile done, 2=preferences done, 3=all done
currentSubStepnumberSub-step terakhir (0-8)
completedAtstring?ISO date jika completed
profileobject?Data profil yang sudah disimpan

POST /onboarding/save-profile

Simpan data profil secara incremental (Step 1). Tidak semua field harus dikirim β€” hanya field yang berubah.

Memerlukan JWT authentication.

Request Body

FieldTipeWajibKeterangan
communityRulesAcceptedbooleanTidakTerima community rules
namestringTidakMin 2 karakter
genderstringTidak"MALE", "FEMALE", "OTHER"
birthDatestringTidakISO date, usia 13-120 tahun
heightnumberTidak50-300 cm (selalu disimpan dalam cm)
heightUnitstringTidak"cm" atau "feet" (preferensi display)
weightnumberTidak20-500 kg (selalu disimpan dalam kg)
weightUnitstringTidak"kg" atau "pound" (preferensi display)
photosstring[]TidakURL foto, maks 6
biostringTidakMaks 500 karakter
countryIdstringTidakID negara
regionIdstringTidakID region/provinsi
cityIdstringTidakID kota
localestringTidakContoh: "id", "en"
timezonestringTidakContoh: "Asia/Jakarta"
subStepnumberTidak0-8, melacak progress
completedbooleanTidaktrue = tandai Step 1 selesai

Contoh Request

curl -X POST https://fumai.app/api/mobile/v1/onboarding/save-profile \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "John Doe", "gender": "MALE", "subStep": 3 }'
const res = await fetch('https://fumai.app/api/mobile/v1/onboarding/save-profile', { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ name: 'John Doe', gender: 'MALE', subStep: 3, }), }) const data = await res.json()

Response 200

{ "success": true, "data": { "message": "Progress saved" } }

Behavior

  • Field yang tidak dikirim = tidak diubah (incremental save)
  • subStep melacak posisi terakhir user untuk resume
  • completed: true menandai Step 1 selesai
  • Timezone otomatis diset dari city > country > "Asia/Jakarta"
  • Photo pertama otomatis jadi avatar user

Info: Tinggi selalu disimpan dalam cm, berat selalu dalam kg. heightUnit dan weightUnit hanya untuk preferensi display.


POST /onboarding/upload-photo

Upload foto profil untuk onboarding. Gunakan URL yang dikembalikan di photos array saat save-profile.

Memerlukan JWT authentication.

Request

Content-Type: multipart/form-data
FieldTipeWajibKeterangan
fileFileYaImage file (JPG, PNG, WebP)

Contoh Request

curl -X POST https://fumai.app/api/mobile/v1/onboarding/upload-photo \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -F "file=@photo.jpg"
const formData = new FormData() formData.append('file', imageFile) const res = await fetch('https://fumai.app/api/mobile/v1/onboarding/upload-photo', { method: 'POST', headers: { Authorization: `Bearer ${accessToken}` }, body: formData, }) const data = await res.json()

Response 200

{ "success": true, "data": { "url": "https://cdn.fumai.app/profile/clx.../1709...-abc123.jpg", "key": "profile/clx.../1709...-abc123.jpg" } }

Batasan

SettingNilai
Ukuran maks5MB
Tipe fileJPEG, PNG, WebP
Min foto2 (untuk lanjut onboarding)
Maks foto6

GET /onboarding/options

Mendapatkan opsi dinamis untuk onboarding Step 2. Opsi dikelola dari database (admin-managed).

Tidak memerlukan authentication.

Query Parameters

ParameterTipeWajibKeterangan
typestringYaTipe opsi (lihat tabel di bawah)

Tipe Opsi

TypeKeteranganJumlah Opsi
motivationAlasan menggunakan Fumai4
activity_stylePreferensi grup aktivitas4
sport_categoryKategori induk olahraga10
sportOlahraga/aktivitas individual127
availabilityKetersediaan waktu5
fitmatch_interestYang dicari di FitMatch8

Contoh Request

curl -X GET "https://fumai.app/api/mobile/v1/onboarding/options?type=motivation"
const res = await fetch( 'https://fumai.app/api/mobile/v1/onboarding/options?type=motivation' ) const data = await res.json()

Response 200

{ "success": true, "options": [ { "optionId": "find_sport_buddy", "label": "Find a sport buddy", "icon": "πŸ‘₯", "category": null, "sortOrder": 0 }, { "optionId": "SOCCER", "label": "Soccer / Football", "icon": "https://cdn.fumai.app/...", "category": "ball_court", "sortOrder": 23 } ] }

Info: Icon bisa berupa emoji string atau URL gambar (SVG/PNG).


POST /onboarding/save-preferences

Simpan preferensi secara incremental (Step 2).

Memerlukan JWT authentication.

Request Body

FieldTipeWajibKeterangan
motivationsstring[]TidakDivalidasi terhadap OnboardingOption
favoriteSportsstring[]TidakMaks 50, divalidasi terhadap DB
activityStylestring[]TidakDivalidasi terhadap DB
preferredAvailabilitystring[]TidakDivalidasi terhadap DB
preferredWorkoutTimestring[]Tidakearly_morning, morning, afternoon, evening, night, flexible
workoutFrequencynumberTidakInteger 1-7 (kali per minggu)
subStepnumberTidakMelacak progress
completedbooleanTidaktrue = tandai Step 2 selesai

Contoh Request

curl -X POST https://fumai.app/api/mobile/v1/onboarding/save-preferences \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "motivations": ["find_sport_buddy", "stay_active"], "favoriteSports": ["SOCCER", "RUNNING"], "activityStyle": ["partner"], "preferredAvailability": ["weekdays", "morning"], "completed": true }'
const res = await fetch('https://fumai.app/api/mobile/v1/onboarding/save-preferences', { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ motivations: ['find_sport_buddy', 'stay_active'], favoriteSports: ['SOCCER', 'RUNNING'], activityStyle: ['partner'], preferredAvailability: ['weekdays', 'morning'], completed: true, }), }) const data = await res.json()

Response 200

{ "success": true, "message": "Progress saved" }

POST /onboarding/save-permissions

Simpan permissions dan selesaikan onboarding (Step 3).

Memerlukan JWT authentication.

Request Body

FieldTipeWajibKeterangan
locationEnabledbooleanYaUser memberikan izin lokasi
latitudenumberTidakGPS latitude (jika lokasi diaktifkan)
longitudenumberTidakGPS longitude (jika lokasi diaktifkan)
pushNotificationsbooleanYaUser memberikan izin push notification

Contoh Request

curl -X POST https://fumai.app/api/mobile/v1/onboarding/save-permissions \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "locationEnabled": true, "latitude": -8.6705, "longitude": 115.2123, "pushNotifications": true }'
const res = await fetch('https://fumai.app/api/mobile/v1/onboarding/save-permissions', { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ locationEnabled: true, latitude: -8.6705, longitude: 115.2123, pushNotifications: true, }), }) const data = await res.json()

Response 200

{ "success": true, "message": "Onboarding completed successfully", "data": { "onboardingCompleted": true, "locationEnabled": true, "pushNotifications": true } }

Info: Endpoint ini menandai onboarding sebagai selesai. Setelah ini, navigasikan user ke halaman utama/dashboard.

Last updated on