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
| Field | Type | Notes |
|---|---|---|
| monthlySummary | MonthlySummary? | Aggregate view for the given month. |
| activities | List<Activity> | Detailed list of activities in the month. |
MonthlySummary
| Field | Type | Notes |
|---|---|---|
| month | Int | Calendar month (1–12). |
| year | Int | Calendar year. |
| acceptedVisitGoalDays | Int | Number of days the visit goal was met. |
| acceptedVisitDays | Int | Number of days with at least one accepted/approved visit. |
| acceptedActivities | Int | Number of accepted activities total. |
| pendingActivities | Int | Activities still pending verification or completion. |
| rejectedActivities | Int | Activities that were denied/rejected. |
Activity
| Field | Type | Notes |
|---|---|---|
| type | ActivityType? | The activity type (e.g., Gym Visit, Smart Walking, Self Report, Home). |
| name | String? | Display name for the activity. |
| iconRes | String? | Optional icon resource identifier. |
| statusType | ActivityStatus | Current status (see below). |
| date | String? | Date string of the activity (ISO-8601). |
| metaData | ActivityMetaData? | Extra information depending on activity type. |
| message | String? | Message or reason (e.g., rejection reason). |
ActivityType
| Value | Key | Notes |
|---|---|---|
| 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
| Value | Notes |
|---|---|
| APPROVED / ACCEPTED / COMPLETED | Used interchangeably to mean the activity was successfully verified or completed. |
| PENDING | Activity pending approval (visits) or pending completion (e.g., ongoing step count). |
| DENIED / REJECTED | Activity could not be verified (location mismatch, service validation failed, or did not meet rules). |
| PARTIAL | Activity was recorded but did not meet thresholds (e.g., insufficient steps). |
| IGNORE | Recorded but does not count towards goals; stored only for tracking. |
| DEFAULT | Fallback when status is not mapped. |
👉 Developer Tip: Treat APPROVED, ACCEPTED, and COMPLETED as equivalent for “goal achieved” logic. Use isApproved helper when available.
ActivityMetaData
| Field | Type | Notes |
|---|---|---|
| facilityId | Int? | Facility identifier. |
| facilityName | String? | Display-friendly name for the facility. |
| address | String? | Facility street address. |
| city | String? | City of the facility. |
| state | String? | State abbreviation. |
| description | String? | Description (used in certain custom activities). |
| timeSpent | Int? | Duration in minutes. |
| steps | Int? | Number of steps (Smart Walking only). |
| distance | Double? | Distance traveled. |
| distanceUnit | String? | Unit of distance (Miles or Kilometers). |
| calories | Double? | Calories burned (Smart Walking only). |
| activeMinutes | Int? | Active minutes (Smart Walking only). |
| lastSync | String? | 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
activitieslist, color-coded byActivityStatus. - Show monthly goals using
acceptedVisitGoalDaysvs. 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