---
title: "HKActivitySummaryQuery: reading Move, Exercise and Stand rings"
canonical: "https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery"
cluster: "HealthKit Queries"
primary_query: "HKActivitySummaryQuery"
last_reviewed: "2026-10-03"
description: "How HKActivitySummaryQuery reads daily ring data: date-component predicates that need a calendar, activityMoveMode, goal properties and the update handler."
publisher: "AIFitnessAPI — independent, not sponsored"
cite_as: "\"HKActivitySummaryQuery: reading Move, Exercise and Stand rings\", AIFitnessAPI, https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery"
---

# HKActivitySummaryQuery: reading Move, Exercise and Stand rings

> HKActivitySummaryQuery reads HKActivitySummary objects, one per day, each holding the Move, Exercise and Stand ring values and goals. You filter it with date components rather than dates, using HKQuery.predicate(forActivitySummariesBetweenStart:end:) or predicateForActivitySummary(with:), and Apple requires those components to carry a valid calendar. Read access is requested with HKObjectType.activitySummaryType(), and summaries can be read but never saved. Since iOS 14.0, activityMoveMode tells you whether the Move ring measures active energy or Apple Move Time, so check it before labelling a Move value as calories.

- Canonical: https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery
- Last reviewed: 2026-10-03
- Publisher: AIFitnessAPI (https://aifitnessapi.com) — independent, not sponsored
- Cite as: "HKActivitySummaryQuery: reading Move, Exercise and Stand rings", AIFitnessAPI, https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery

---

Activity summaries are the only HealthKit data organised by the user's day rather than by timestamps, and that one difference produces most of the bugs. This page covers the query and the object it returns, from Apple's documentation.

## What it returns

`HKActivitySummaryQuery` is "A query for reading activity summary objects from the HealthKit store." Each `HKActivitySummary` is "An object that contains the move, exercise, and stand data for a given day."

Apple adds two properties of the object that surprise people:

- "Unlike the HKSample subclasses, HKActivitySummary instances are mutable, but changes made to the object's properties have no affect on the values in the HealthKit store."
- "You can instantiate your own HKActivitySummary objects (if needed), but you can't save HKActivitySummary objects to the store."

To read them, request authorization for `HKObjectType.activitySummaryType()`. Apple: "Use this type to request permission to read HKActivitySummary objects from the HealthKit store." The rest of the authorization flow is in the [HealthKit integration guide](/integrate/healthkit).

**Availability.** `HKActivitySummary` and `activitySummaryType()` are listed from iOS 9.3, iPadOS 9.3, Mac Catalyst 13.0, macOS 13.0, visionOS 1.0 and watchOS 2.2. Apple's class page for the query lists iOS, iPadOS, Mac Catalyst, macOS, visionOS and watchOS without an introduction version.

## Predicates use date components, with a calendar

The two activity summary predicates take `DateComponents`, not `Date`:

- `predicateForActivitySummary(with:)`: "Returns a predicate that matches the activity summary for the specified day."
- `predicate(forActivitySummariesBetweenStart:end:)`: "Returns a predicate for matching all the activity summaries that fall between the days identified by the start and end date components."

Both carry the same two warnings in their parameter descriptions. The components identify a day "as perceived by the user. This day may be longer or shorter than 24 hours (for example, if the user traveled across time zones)." And: "The date components must have a valid calendar property." Apple's own example sets `calendar` on both component values explicitly and extracts `.day`, `.month`, `.year` and `.era`. The summary's `dateComponents(for:)` method returns, for the Gregorian calendar, "only the era, year, month, and day."

## The query and its update handler

`init(predicate:resultsHandler:)` takes the predicate ("Pass nil to receive all activity samples") and a handler that receives the query, an array of summaries and an error. The handler runs on a background queue.

The query is "mostly immutable. You can assign the query's updateHandler property after instantiating the object, but before executing the query." With an update handler it keeps running: Apple says it executes the handler "If any new, matching summaries are saved to the store—or if any of the existing matching summaries are modified in the store". The property's own page adds: "This property cannot be modified once the query has been executed. If you assign a handler to this property, you must manually stop the query." Stop it with the store's `stop(_:)`.

## A week of rings

```swift
import HealthKit

func readLastWeekOfRings(store: HKHealthStore, calendar: Calendar = .current) {
    let endDate = Date()
    guard let startDate = calendar.date(byAdding: .day, value: -7, to: endDate) else { return }

    let units: Set<Calendar.Component> = [.day, .month, .year, .era]
    var startComponents = calendar.dateComponents(units, from: startDate)
    startComponents.calendar = calendar                    // required by Apple
    var endComponents = calendar.dateComponents(units, from: endDate)
    endComponents.calendar = calendar

    let lastWeek = HKQuery.predicate(forActivitySummariesBetweenStart: startComponents,
                                     end: endComponents)

    let query = HKActivitySummaryQuery(predicate: lastWeek) { _, summaries, error in
        guard let summaries else { return }                // nil only when error is set
        for summary in summaries {
            let measuresTime = summary.activityMoveMode == .appleMoveTime
            // read activeEnergyBurned or appleMoveTime accordingly
        }
    }
    store.execute(query)
}
```

This follows Apple's "Executing Activity Summary Queries" article. With Swift concurrency, `HKActivitySummaryQueryDescriptor` returns `[HKActivitySummary]` from `result(for:)` and offers `results(for:)` for updates; see the [async query descriptors page](/healthkit-queries/healthkit-async-query-descriptors).

## What a summary contains

| Property | Apple's description | Listed from |
| --- | --- | --- |
| `activityMoveMode` | "The move mode that they system used for this activity summary." | iOS 14.0, watchOS 7.0 |
| `activeEnergyBurned` / `activeEnergyBurnedGoal` | "The amount of active energy the user burned during the specified day." / the daily goal; energy units | iOS 9.3, watchOS 2.2 |
| `appleMoveTime` / `appleMoveTimeGoal` | "The amount of time the user spent performing activities that involve full-body movements during the specified day." / the goal; time units | iOS 14.0, watchOS 7.0 |
| `appleExerciseTime` | "The amount of time that the user has spent exercising during the specified day." | iOS 9.3, watchOS 2.2 |
| `exerciseTimeGoal` | "The user's daily goal for exercise time." Optional. | iOS 16.0, watchOS 9.0 |
| `appleStandHours` | "The number hours in the specified day during which the user has stood and moved for at least a minute per hour." | iOS 9.3, watchOS 2.2 |
| `standHoursGoal` | "The user's daily goal for stand hours." Optional. | iOS 16.0, watchOS 9.0 |
| `isPaused` | Apple's page has no description. | iOS 18.0, watchOS 11.0 |

Apple's documentation data marks the older `appleExerciseTimeGoal` and `appleStandHoursGoal` as deprecated at iOS 27.2 and watchOS 27.2, with no replacement note on their pages. The optional `exerciseTimeGoal` and `standHoursGoal` above, listed from iOS 16.0, carry matching descriptions.

The per-sample counterparts of these values are separate quantity types, such as [`activeEnergyBurned`](/healthkit/activity#id-activeenergyburned), [`appleExerciseTime`](/healthkit/activity#id-appleexercisetime) and [`appleStandTime`](/healthkit/activity#id-applestandtime), read with the ordinary sample and statistics queries.

## The Move ring is not always calories

`HKActivityMoveMode` has two values, `activeEnergy` and `appleMoveTime`. Apple explains why: "For younger users, HealthKit's activity summary can track move time instead of active energy burned", and spells out the rule: users under 13 are encouraged to track move time, users 13 to 18 can choose either, and "All users over 18 years old track active energy burned." For display, Apple points to `HKActivityRingView` on iOS and `WKInterfaceActivityRing` on watchOS. If your users are children, [the kids fitness app build guide](/build/kids-fitness-app) covers the consent and data-minimisation constraints that come before any of this.

## Pitfalls

- **Components without a calendar.** Apple says the date components "must have a valid calendar property." Set it explicitly, as Apple's sample does.
- **Assuming a day is 24 hours.** Apple's own note: each summary covers one day that "always begins and ends at midnight; however, the day may be longer or shorter than 24 hours". Do not compute a summary's day by adding 86,400 seconds; see [timezones and day boundaries](/architecture/timezones-and-day-boundaries).
- **Labelling Move as kilocalories.** Check `activityMoveMode` first; for a younger user the Move ring may be measuring minutes. The type identifiers behind this, the `activityMoveMode` characteristic and the `appleMoveTime` quantity type, are listed on [the HealthKit types introduced in iOS 14](/healthkit-versions/ios-14).
- **Trying to save a summary.** Apple says summaries cannot be saved to the store, and editing a fetched one changes nothing in HealthKit.
- **Leaving a long-running query behind.** With an update handler set, Apple says you must stop the query manually.
- **Reading meaning into isPaused.** Apple's page for it carries a declaration and availability only. Apple does not document what a paused summary means, so do not build logic on a guess.

## FAQ

### Which HealthKit permission lets my app read activity ring data?

Read authorization for the activity summary type, which you get from HKObjectType.activitySummaryType(). Apple documents that this method returns the shared HKActivitySummaryType instance and that you use it to request permission to read HKActivitySummary objects from the HealthKit store. Include it in the read types you pass when requesting authorization, alongside any per-sample types such as active energy.

[Permalink](https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery#faq-1)

### Does the Move ring in HKActivitySummary always measure calories?

No. Since iOS 14.0 the activityMoveMode property says whether the Move ring measures active energy burned or Apple Move Time. Apple explains that users under 13 are encouraged to track move time, users aged 13 to 18 can choose either, and users over 18 track active energy. When the mode is appleMoveTime, read appleMoveTime and appleMoveTimeGoal instead of the energy properties.

[Permalink](https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery#faq-2)

### Can my app save an HKActivitySummary to HealthKit?

No. Apple states that you can create your own HKActivitySummary objects if needed but cannot save them to the store. The objects you read are mutable, but Apple notes that changing their properties has no effect on the values stored in HealthKit. Activity data enters HealthKit through the underlying samples, not through summaries.

[Permalink](https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery#faq-3)

### Why do activity summary predicates need date components with a calendar?

Because activity summaries are keyed to the user's day, not to absolute timestamps. Apple's documentation for predicateForActivitySummary(with:) and predicate(forActivitySummariesBetweenStart:end:) says the components identify a day as perceived by the user, which may be longer or shorter than 24 hours after time-zone travel, and that the date components must have a valid calendar property. Apple's sample sets the calendar on the components explicitly.

[Permalink](https://aifitnessapi.com/healthkit-queries/hkactivitysummaryquery#faq-4)
