Google Fit provides a set of health and wellness data types under the `com.google` namespace.

Data types define the format of the values inside data points. A data point can represent:

- An instantaneous reading or observation
- An aggregate with statistics over a time interval

Google Fit defines data types for instantaneous observations and data types for aggregate
data. Data points consist of values for the fields of a data type and timestamp information.
Points that represent instantaneous observations include a timestamp, and points of
an aggregate data type also include the start time for the interval.

Google Fit also lets you define new data types.

## Data type groups

Google Fit has these data types:

Public data types
:   Standard data types provided by the platform have the 'com.google' prefix. For example, *com.google.step_count.delta*. These data types capture instant readings for
    health and wellness data, including fitness activity, sleep and nutrition. Any
    app can request the relevant permissions to read and write to these data types,
    except for a few location data types which can only be read by the app that
    wrote them.

For more information, see:

- [Activity data types](https://developers.google.com/fit/datatypes/activity)
- [Location data types](https://developers.google.com/fit/datatypes/location)
- [Nutrition data types](https://developers.google.com/fit/datatypes/nutrition)

Health data types
:   Data types provided by the platform that have restricted access due to
    potentially sensitive data. For more information, see [Health data
    types](https://developers.google.com/fit/datatypes/health).

Aggregate data types
:   Data types to read health and wellness information aggregated by time or
    activity type. For more information, see [Aggregate data
    types](https://developers.google.com/fit/datatypes/aggregate).

Private custom data types
:   Custom data types defined by a specific app. Only the app that defines the
    data type can read and write data of this type. For more information, see
    [Custom data types](https://developers.google.com/fit/datatypes/custom).

## Using data types

> [!NOTE]
> **Note:** Time ranges for data points from the same stream shouldn't overlap! If they do, data from the overlapping period will be dropped which could cause discrepancies between expected and displayed values.

### Android

On Android, data types are defined as public fields of the
[`DataType`](https://developers.google.com/android/reference/com/google/android/gms/fitness/data/DataType)
class. How you invoke the Fitness APIs with the data type depends on what you want to accomplish:

- To record data, use the [Recording API](https://developers.google.com/fit/android/record) to create a subscription for each data type you want to record.
- To read data, use the [History API](https://developers.google.com/fit/android/history) to submit a read request for each data type.
- To insert historical data from the past, use the [History API](https://developers.google.com/fit/android/history) to submit an insert request for each data type.
- To create sessions, use the [Sessions API](https://developers.google.com/fit/android/using-sessions) to insert or record data with session metadata.

To create data points for an instaneous
[`DataType`](https://developers.google.com/android/reference/com/google/android/gms/fitness/data/DataType)
object, assign values with the correct format. The following example shows you
how to assign the food item as a string, the meal type as a constant from the
[`Field`](https://developers.google.com/android/reference/com/google/android/gms/fitness/data/Field) class,
and nutrient contents as mapped float values.

```kotlin
val nutritionSource = DataSource.Builder()
    .setDataType(DataType.TYPE_NUTRITION)
    ...
    .build()

val nutrients = mapOf(
    Field.NUTRIENT_TOTAL_FAT to 0.4f,
    Field.NUTRIENT_SODIUM to 1f,
    Field.NUTRIENT_POTASSIUM to 422f
)
val banana = DataPoint.builder(nutritionSource)
    .setTimestamp(now, TimeUnit.MILLISECONDS)
    .setField(Field.FIELD_FOOD_ITEM, "banana")
    .setField(Field.FIELD_MEAL_TYPE, Field.MEAL_TYPE_SNACK)
    .setField(Field.FIELD_NUTRIENTS, nutrients)
    .build()
```

After setting data points in your app, you can insert, read, or delete
historical data with the [History API](https://developers.google.com/fit/android/history).

### REST

The [`dataSources`](https://developers.google.com/fit/rest/v1/reference/users/dataSources) resource includes the data type
(and a list of its fields) for each data source. You can specify one of these data types when
you create data sources, and you can obtain the name of the data type and a list of its fields
when you retrieve a data source from the fitness store.

For example, a data source representation specifies its data type as follows:

```restructuredtext
{
"dataStreamId": "exampleDataSourceId",
...
"dataType": {
  "name": "com.google.step_count.delta"
},
...
}
```

## Authorization scopes

Authorization scopes cover groups of data types that a user can authorize an app to
access. They help users understand what kinds of data an app wants to access.
They also make it easier to give apps permission to use that data by not having
to approve each individual data type. Users grant these permissions once they've
downloaded your app.
![Example of the OAuth scopes consent screen](https://developers.google.com/static/fit/images/OAuth_scopes_example.png) **Figure 2.**The OAuth scopes consent screen.

After you've tested your app with a small number of users, before launching your
app you need to [request verification](https://developers.google.com/fit/verification) based on the
scopes relevant to those data types. Read through the data types pages linked
above to understand which scopes apply to each data type.

For example, if your app needs to read and write writing blood pressure, it
needs to declare it's doing both read and write and request both scopes. If it's
only writing blood pressure data to the Google Fit platform, it only needs to
request the write scope.

Choose data types responsibly. Don't request every data type in case your app
might need it. The types specified determine which scopes the user is prompted
to grant permission for. Only ask for the data types your app needs so users are
more likely to grant access. Users more readily grant access to limited, clearly
described scopes.

Use this table to check if the scopes your app needs access to are sensitive or
restricted (which determines the [verification
steps](https://developers.google.com/fit/verification#next-steps) you'll need to follow):

| Scope | Description | Category |
|---|---|---|
| `https://www.googleapis.com/auth/fitness.activity.read` | Read activity data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.activity.write` | Write activity data to the Google Fit platform | Restricted |
| `https://www.googleapis.com/auth/fitness.blood_glucose.read` | Read blood glucose data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.blood_glucose.write` | Write blood glucose data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.blood_pressure.read` | Read blood pressure data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.blood_pressure.write` | Write blood pressure data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.body.read` | Read body measurement data (height, weight, body fat percentage) from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.body.write` | Write body measurement data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.body_temperature.read` | Read body temperature data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.body_temperature.write` | Write body temperature data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.heart_rate.read` | Read heart rate data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.heart_rate.write` | Write heart rate data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.location.read` | Read location data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.location.write` | Write location data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.nutrition.read` | Read nutrition data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.nutrition.write` | Write nutrition data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.oxygen_saturation.read` | Read oxygen saturation data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.oxygen_saturation.write` | Write oxygen saturation data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.reproductive_health.read` | Read reproductive health data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.reproductive_health.write` | Write reproductive health data to the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.sleep.read` | Read sleep data from the Google Fit platform. | Restricted |
| `https://www.googleapis.com/auth/fitness.sleep.write` | Write sleep data to the Google Fit platform. | Restricted |

## Adding new scopes to an existing app

When you update your app to request a new scope (for example, if you add the new
sleep or heart rate scopes, or add a read scope), users will be prompted that
your app is requesting access to these scopes and they can choose to grant
or reject access.

It's best practice to request authorization from users for resources at the time
you need them. Follow the guidelines on requesting [incremental
authorization](https://developers.google.com/identity/protocols/oauth2/web-server#incrementalAuth).

Users will be more likely to grant access if they understand why/how your app
uses this data:

- Consider adding a screen that warns/informs users that they'll be asked for these scopes.
- Clearly explain why your app is asking for access to these scopes/data so users can make an informed decision.

Learn more about [best practices around app permissions for Android](https://developer.android.com/training/permissions/usage-notes).