Skip to main content

Activities

The Activities feature provides monthly, daily, and type-based summaries of member activity data.
This API is calendar-based and should be queried for each month to build an activity history view.


What you can build

  • A calendar-style activity summary per month.
  • Activity detail cards showing metadata like facility name, steps, distance, or calories.

Data Model

AFActivitiesSummary

FieldTypeNotes
monthlySummaryMonthlySummary?Aggregate view for the given month.
activitiesList<Activity>Detailed list of activities in the month.

MonthlySummary

FieldTypeNotes
monthIntCalendar month (1–12).
yearIntCalendar year.
acceptedVisitGoalDaysIntNumber of days the visit goal was met.
acceptedVisitDaysIntNumber of days with at least one accepted/approved visit.
acceptedActivitiesIntNumber of accepted activities total.
pendingActivitiesIntActivities still pending verification or completion.
rejectedActivitiesIntActivities that were denied/rejected.

Activity

FieldTypeNotes
typeActivityType?The activity type (e.g., Gym Visit, Smart Walking, Self Report, Home).
nameString?Display name for the activity.
iconResString?Optional icon resource identifier.
statusTypeActivityStatusCurrent status (see below).
dateString?Date string of the activity (ISO-8601).
metaDataActivityMetaData?Extra information depending on activity type.
messageString?Message or reason (e.g., rejection reason).

ActivityType

ValueKeyNotes
GYM_VISIT_ACTIVITY"gym"Facility visit tracked by geofencing.
SMART_WALKING_ACTIVITY"walking"SmartWalking (steps, distance, calories).
SELF_REPORTED_ACTIVITY"mobileSelfReport"Activities self-reported manually by the member.
HOME_ACTIVITY"fitAtHome"At-home workouts.

ActivityStatus

ValueNotes
APPROVED / ACCEPTED / COMPLETEDUsed interchangeably to mean the activity was successfully verified or completed.
PENDINGActivity pending approval (visits) or pending completion (e.g., ongoing step count).
DENIED / REJECTEDActivity could not be verified (location mismatch, service validation failed, or did not meet rules).
PARTIALActivity was recorded but did not meet thresholds (e.g., insufficient steps).
IGNORERecorded but does not count towards goals; stored only for tracking.
DEFAULTFallback when status is not mapped.

👉 Developer Tip: Treat APPROVED, ACCEPTED, and COMPLETED as equivalent for “goal achieved” logic. Use isApproved helper when available.

ActivityMetaData

FieldTypeNotes
facilityIdInt?Facility identifier.
facilityNameString?Display-friendly name for the facility.
addressString?Facility street address.
cityString?City of the facility.
stateString?State abbreviation.
descriptionString?Description (used in certain custom activities).
timeSpentInt?Duration in minutes.
stepsInt?Number of steps (Smart Walking only).
distanceDouble?Distance traveled.
distanceUnitString?Unit of distance (Miles or Kilometers).
caloriesDouble?Calories burned (Smart Walking only).
activeMinutesInt?Active minutes (Smart Walking only).
lastSyncString?Last datetime the activity was synced.

Get Activities

Android (Kotlin)

lifecycleScope.launch {
val result = AFCore.activities().get(month = 11, year = 2025)

val summary = result.monthlySummary
val activities = result.activities

// Example: Print summary
logger.d("Month: ${summary.month}/${summary.year}")
logger.d("Accepted Days: ${summary.acceptedVisitDays} / Goal: ${summary.acceptedVisitGoalDays}")
logger.d("Activities: Accepted=${summary.acceptedActivities}, Pending=${summary.pendingActivities}, Rejected=${summary.rejectedActivities}")

// Loop through each activity
activities.forEach { activity ->
logger.d("Activity:")
logger.d("- Name: ${activity.name}")
logger.d("- Type: ${activity.type}")
logger.d("- Status: ${activity.statusType}")
logger.d("- Date: ${activity.date}")
logger.d("- MetaData: ${activity.metaData}")
logger.d("- Message: ${activity.message}")
}
}

iOS (Swift)

func loadActivities() async {
do {
let result = try await AFCore.activities().get(month: 11, year: 2025)

let summary = result.monthlySummary
let activities = result.activities

// Example: Print summary
print("Month: \(summary.month)/\(summary.year)")
print("Accepted Days: \(summary.acceptedVisitDays) / Goal: \(summary.acceptedVisitGoalDays)")
print("Activities: Accepted=\(summary.acceptedActivities), Pending=\(summary.pendingActivities), Rejected=\(summary.rejectedActivities)")

// Loop through activity list
for activity in activities {
print("Activity:")
print("- Name: \(activity.name ?? "No name")")
print("- Type: \(String(describing: activity.type))")
print("- Status: \(activity.statusType)")
print("- Date: \(activity.date ?? "N/A")")

if let meta = activity.metaData {
print("- MetaData: \(meta)")
}

if let message = activity.message {
print("- Message: \(message)")
}
}

} catch {
print("Error loading activities: \(error.localizedDescription)")
}
}

UI patterns & tips

  • Build calendar views using the activities list, color-coded by ActivityStatus.
  • Show monthly goals using acceptedVisitGoalDays vs. total days.

Error handling

  • Network errors: show retry or offline state.
  • Invalid month/year: handle gracefully with default/fallback.
  • Rejected activities: display reason (Activity.message) to the member.

Document updated: 2025-11-20