La API de Google Health es una nueva API creada desde cero que permite a los desarrolladores consultar los datos de los usuarios de Fitbit. No se trata solo de una actualización, sino de un movimiento estratégico para garantizar que tus apps sean seguras, confiables y estén listas para los futuros avances en tecnología de la salud. La API admite una nueva consola para registrar tus apps, compatibilidad con OAuth 2.0 de Google, nuevos tipos de datos, un nuevo esquema de extremos y un nuevo formato de respuesta.
La guía está diseñada para ayudar a los desarrolladores a migrar sus apps existentes de la API de Fitbit Web a la nueva API de Google Health.
¿Por qué deberías migrar?
Estos son los beneficios de usar la API de Google Health:
- Seguridad mejorada: Cumplimiento de las prácticas recomendadas de seguridad de Google, en consonancia con los estándares de seguridad, privacidad e identidad de Google
- Coherencia: Elimina las incoherencias heredadas en los formatos de datos, las zonas horarias, las unidades de medida y el control de errores para brindar una experiencia del desarrollador más intuitiva.
- Escalabilidad y preparación para el futuro: Diseñado para escalar y satisfacer las demandas futuras, y admite protocolos modernos como gRPC.
Registro de la app
Todas las apps de las APIs de Google Health deben registrarse con la consola de Google Cloud, que funciona como un centro central para administrar todas tus apps de Google.
Si quieres obtener instrucciones para registrar tu app, sigue los pasos que se indican en Primeros pasos. Estas son las diferencias que notarás cuando registres tus apps.
| API web de Fitbit | API de Google Health | |
| Vínculos públicos | https://dev.fitbit.com/apps | https://console.cloud.google.com |
| Cómo agregar una app nueva | Presiona Registrar una app nueva. |
|
| Información básica | Campos que debes completar:
|
Campos que debes completar:
|
| Tipos de aplicaciones | El desarrollador debe seleccionar lo siguiente:
|
|
| ID de cliente | Se registra cuando se guarda la configuración de la aplicación | Se registran por separado |
| Tipo de acceso | El acceso de lectura y escritura se controla a nivel de la app | El acceso de lectura y escritura se controla a nivel del alcance |
| URLs adicionales |
|
|
Implementación de OAuth
Las apps de la API de Google Health solo admiten las bibliotecas cliente de Google OAuth2. Las bibliotecas cliente están disponibles para frameworks populares, lo que simplifica la implementación de OAuth 2.0. Las diferencias entre las bibliotecas de Google OAuth2 y las bibliotecas de OAuth2 de código abierto son las siguientes:
| API web de Fitbit | API de Google Health | |
| Compatibilidad con la biblioteca de OAuth2 | Código abierto | Bibliotecas cliente de Google OAuth2 |
| Funcionalidad | Incongruente en las diferentes plataformas | Coherencia en todas las plataformas |
| URL de autorización | https://www.fitbit.com/oauth2/authorize | https://accounts.google.com/o/oauth2/v2/auth |
| URL del token | https://api.fitbit.com/oauth2/token | https://oauth2.googleapis.com/token |
| Duración del token de acceso | 8 horas | 1 hora |
| Tamaño del token de acceso | 1,024 bytes | 2,048 bytes |
| Token de actualización | Los tokens de actualización se generan cuando se usa el flujo de otorgamiento de código de autorización. Solo se puede generar 1 token de actualización para un usuario. Los tokens nunca vencen y solo se pueden usar una vez. | Para generar un token de actualización, la cadena de autorización debe contener el parámetro de consulta "access_type=offline". Se pueden crear varios tokens de actualización para un solo usuario. Los tokens de actualización pueden basarse en el tiempo. Vencerán si no se usan en 6 meses, si el usuario otorgó acceso basado en el tiempo o si la app está en modo de "Prueba". Consulta Vencimiento del token de actualización para obtener más detalles. |
| Token Response | La respuesta JSON contiene lo siguiente:
|
La respuesta JSON contiene lo siguiente:
Para obtener el ID de usuario, usa el extremo users.getIdentity. |
Reautenticación del usuario (reconsentimiento obligatorio)
Los usuarios de Fitbit deben volver a dar su consentimiento para tu nueva integración, ya que tu app usa una biblioteca de OAuth diferente. No es posible transferir tokens de acceso y tokens de actualización a la API de Google Health para que funcionen.
Permisos
Debes actualizar tu solicitud de autorización para usar los alcances de la API de Google Health. Los alcances definen si tu app admite operaciones de lectura o escritura. No uses permisos que no sean necesarios para tu app. Siempre puedes agregar más permisos más adelante si cambia el diseño de tu app.
Los permisos de la API de Google Health son URLs HTTP que comienzan con https://www.googleapis.com/auth/googlehealth.{scope}. Por ejemplo, https://www.googleapis.com/auth/googlehealth.activity_and_fitness.
Asignaciones de alcance
A continuación, se muestra cómo se asignan los permisos de la API de Fitbit Web a los permisos de la API de Google Health:
| Permisos de la API de Fitbit Web | Permisos de las APIs de Google Health |
|---|---|
| actividad | .activity_and_fitness .activity_and_fitness.readonly |
| cardio_fitness | .activity_and_fitness .activity_and_fitness.readonly |
| Frecuencia cardíaca | .health_metrics_and_measurements .health_metrics_and_measurements.readonly |
| ubicación | .location.readonly |
| nutrición | .nutrition .nutrition.readonly |
| oxygen_saturation | .health_metrics_and_measurements .health_metrics_and_measurements.readonly |
| perfil | .profile .profile.readonly |
| respiratory_rate | .health_metrics_and_measurements .health_metrics_and_measurements.readonly |
| configuración | .settings .settings.readonly |
| sleep | .sleep .sleep.readonly |
| temperatura | .health_metrics_and_measurements .health_metrics_and_measurements.readonly |
| peso | .health_metrics_and_measurements .health_metrics_and_measurements.readonly |
Tipos de datos
A continuación, se incluye una lista de los tipos de datos de la API de Google Health y cómo se asignan a la API de Fitbit Web.
| Tipo de datos de la API de Fitbit Web | Tipo de datos de la API de Google Health ID de extremo |
|---|---|
| Minutos en zona activa | Minutos en Zona activaactive-zone-minutes
|
| Contiene cambios en los niveles de actividad del usuario | Nivel de actividadactivity-level
|
| Elevación | Altitudaltitude
|
| Grasa corporal | Grasa corporalbody-fat
|
caloriesOut en cada zona de frecuencia cardíaca |
Calorías en la zona de frecuencia cardíacacalories-in-heart-rate-zone
|
| Resumen del VFC | Variabilidad del ritmo cardíaco diariadaily-heart-rate-variability
|
| Resumen de SpO2 | Saturación de oxígeno diariadaily-oxygen-saturation
|
| Frecuencia cardíaca en reposo | Frecuencia cardíaca en reposo diariadaily-resting-heart-rate
|
| Temperatura cutánea | Derivaciones diarias de la temperatura durante el sueñodaily-sleep-temperature-derivations
|
| Distancia | Distanciadistance
|
| Actividad grabada | Ejercicioexercise
|
| Pisos | Pisosfloors
|
| Frecuencia cardíaca | Frecuencia cardíacaheart-rate
|
| VFC intradía | Variabilidad de la frecuencia cardíacaheart-rate-variability
|
| SpO2 intradía | Saturación de oxígenooxygen-saturation
|
| Valor del VO2 máx. cuando el usuario corre | VO2 máx. en carrerasrun-vo2-max
|
| Serie temporal de minutos de actividad sedentaria | Período sedentariosedentary-period
|
| Sueño | Sueñosleep
|
| Pasos | Pasossteps
|
Actividad caloriesOut |
Calorías totalestotal-calories
|
| Valor de VO2 máx. | VO2 máx.vo2-max
|
| Peso | Pesoweight
|
Extremos
Los extremos de REST adoptan una sintaxis coherente para todos los tipos de datos.
- Extremo de servicio: La URL HTTP base cambia a https://health.googleapis.com.
- Sintaxis del extremo: La API de Google Health admite una cantidad limitada de extremos, que pueden usar la mayoría de los tipos de datos admitidos. Esto proporciona una sintaxis coherente para todos los tipos de datos y facilita el uso de los extremos.
- Identificador de usuario: Se debe especificar el ID de usuario o me en la sintaxis del extremo. Cuando se usa, el ID del usuario se infiere del token de acceso.
Ejemplo: A continuación, se muestra un ejemplo del extremo GET Profile llamado con la API de Google Health
GET https://health.googleapis.com/v4/users/me/profile
Asignaciones de extremos
Consulta la tabla Disponibilidad de tipos de datos para obtener una lista de los tipos de datos disponibles y los métodos de API que admiten.
| Tipo de extremo de la API web de Fitbit | API de Google Health |
| GET (Log | Summary | Daily Summary) cuando solicitas datos de un solo día | Método dailyRollup con windowSize = 1 día |
| GET (intradía) cuando solicitas datos detallados | Método list |
| GET (series temporales) por fecha o intervalo | Método rollUp o dailyRollUp que incluye un período |
| GET (lista de registros) | Método list |
| Registros de CREATE y UPDATE | Método patch |
| Borrar registros | Método batchDelete |
| GET Profile | users.getProfile devuelve la información específica del usuario.
users.getSettings devuelve las unidades y las zonas horarias del usuario. |
| ACTUALIZA el perfil | users.updateProfile modifica la información específica del usuario.
users.updateSettings modifica las unidades y las zonas horarias del usuario. |
| Obtener el ID de usuario | users.getIdentity devuelve el ID de usuario heredado de Fitbit y el ID de usuario de Google. |
Migra a tus usuarios
La migración de la API de Fitbit Web a la API de Google Health es más que una actualización técnica. Tus usuarios deben volver a dar su consentimiento para tu nueva integración debido a que cambiaste la biblioteca de OAuth. No es posible transferir tokens de acceso y tokens de actualización a la API de Google Health para que funcionen. Para ayudarte con la retención de usuarios durante la migración, aquí tienes algunas sugerencias técnicas y estratégicas para lograr una migración exitosa.
La estrategia de biblioteca dual
Como la API de Fitbit Web y la API de Google Health usan diferentes bibliotecas de OAuth2, debes administrar un período de "puente" en el que ambas bibliotecas existan en tu código base.
Administración de autorizaciones paralelas
- Encapsula los clientes: Crea una capa de abstracción o una interfaz para tu "Servicio de salud". Esto permite que el resto de tu app solicite datos sin saber qué biblioteca (OAuth de Fitbit o OAuth de Google) está activa para ese usuario específico.
- Actualización del esquema de la base de datos: Actualiza tu tabla de usuarios para incluir una marca
oauth_type. Por ejemplo, usafitbitpara Fitbit OAuth ygooglepara Google OAuth.- Usuarios nuevos: Se establece de forma predeterminada la API de Google Health y la biblioteca de OAuth de Google. Establece
oauth_typeengoogle. - Usuarios existentes: Sigan usando la API de Fitbit Web hasta que completen el flujo de nuevo consentimiento. Establece
oauth_typeenfitbit.
- Usuarios nuevos: Se establece de forma predeterminada la API de Google Health y la biblioteca de OAuth de Google. Establece
Flujo de nuevo consentimiento "Step-Up"
En lugar de forzar el cierre de sesión, usa un enfoque de autorización incremental:
- Detect Fitbit Open Source Token: Cuando un usuario de la API de Fitbit Web abre la app, se activa una notificación de "Actualización del servicio".
- Iniciar el flujo de OAuth de Google: Cuando el usuario haga clic en "Actualizar", inicia el flujo de la biblioteca de OAuth2 de Google.
- Reemplazar y revocar: Una vez que se recibe correctamente el token de OAuth de Google, guárdalo en el perfil del usuario, actualiza
oauth_typedefitbitagoogley, si es posible, revoca de forma programática el tokenfitbitanterior para mantener limpio el perfil de seguridad del usuario.
Maximiza la retención de usuarios
El reconsentimiento es la "zona de peligro" de la deserción. Para evitar que los usuarios abandonen la app, sigue estas prácticas recomendadas de UX:
La comunicación "Primero el valor"
No comiences con "Actualizamos nuestra API". Comienza con los beneficios del nuevo sistema respaldado por Google:
- Seguridad mejorada: Menciona la protección de cuentas líder en la industria de Google y la 2FA.
- Confiabilidad: Tiempos de sincronización más rápidos y conexiones de datos más estables
- Feature Gating: Informa a los usuarios de forma gradual que las funciones y los tipos de datos nuevos requieren la actualización.
Smart Timing
- No interrumpas las tareas valiosas: Nunca actives la pantalla de volver a dar el consentimiento mientras un usuario está en medio de un entrenamiento o registrando alimentos.
- Fase de "sugerencia": Durante los primeros 30 días, usa un banner que se pueda descartar.
- Fase de "cierre definitivo": Solo se hará obligatorio el nuevo consentimiento después de varias semanas de advertencias, lo que coincidirá con los plazos oficiales de baja de la API de Fitbit Web.
Comparación del flujo de migración
Una distinción visual clara entre los flujos antiguos y nuevos ayuda a los desarrolladores a comprender dónde se bifurca la lógica.
| Función | API de Fitbit Web (heredada) | API de Google Health (Google-Identity) |
| Biblioteca de autenticación | Código abierto estándar | Google Identity Services (GIS) o Google Auth |
| Cuentas de usuario | Credenciales heredadas de Fitbit | Cuenta de Google |
| Tipo de token | Acceso o actualización específicos de Fitbit | Tokens de acceso y actualización emitidos por Google |
| Administración del alcance | Permisos amplios | Permisos detallados o incrementales |
Cómo controlar los detalles de la migración de cuentas
Según la documentación de Fitbit, los usuarios que migran su cuenta a Google generalmente no pierden sus conexiones de terceros de inmediato, pero cambiar la versión de la API es un requisito del desarrollador.
- Check Token Validity: Usa un proceso en segundo plano para verificar si los tokens de Fitbit fallan con errores de "Unauthorized". Esto puede indicar que el usuario migró su cuenta, pero tu app no se actualizó.
- Errores controlados: Si falla una llamada de OAuth de Fitbit, redirecciona al usuario a una página personalizada de "Volver a conectar Fitbit" que use específicamente el nuevo flujo de OAuth de Google.
Ejemplo de código
Para migrar de la API de Fitbit Web heredada a la API de Google Health, pasarás de las bibliotecas generales de OAuth2 a la biblioteca de Google Auth. A continuación, se incluye una sugerencia de arquitectura y una implementación de pseudocódigo escrita en JavaScript para controlar este estado de "biblioteca dual".
1. El "interruptor de middleware"
Como no puedes migrar a todos los usuarios a la vez, tu backend debe determinar qué biblioteca usar según el valor de apiVersion actual del usuario almacenado en tu base de datos.
Implementación
const { OAuth2Client } = require('google-auth-library');
const FitbitV1Strategy = require('fitbit-oauth2-library').Strategy;
// 1. Initialize the Google Health API Client
const GHAClient = new OAuth2Client(
process.env.GOOGLE_CLIENT_ID,
process.env.GOOGLE_CLIENT_SECRET,
process.env.REDIRECT_URI
);
// 2. Create a Unified Fetcher
async function fetchSteps(user) {
if (user.apiVersion === 4) {
// ---- GOOGLE OAUTH LIBRARY LOGIC ----
GHAClient.setCredentials({ refresh_token: user.refreshToken });
const url = 'GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints';
const res = await GHAClient.request({ url });
return res.data;
} else {
// ---- FITBIT WEB API LEGACY LOGIC ----
// Use your existing Fitbit open-source library logic here
return callLegacyV1Api(user.accessToken);
}
}
2. Migra el flujo de UX
Para maximizar la retención, usa un patrón de "Interrupción y actualización". Esto garantiza que el usuario no se vea obligado a volver a acceder hasta que ya esté interactuando con la app.
Lógica de redireccionamiento
Cuando un usuario de la API de Fitbit Web accede a una función específica, se activa la migración:
app.get('/dashboard', async (req, res) => {
const user = await db.users.find(req.user.id);
if (user.apiVersion === 1) {
// Render a "soft" migration page explaining the Google transition
return res.render('migrate-to-google', {
title: "Keep your data syncing",
message: "Fitbit is moving to Google accounts. Re-connect now to stay updated."
});
}
const data = await fetchSteps(user);
res.render('dashboard', { data });
});
3. Transiciones técnicas clave
Cuando escribas tus secuencias de comandos de migración de JavaScript, ten en cuenta estas diferencias:
| Función | API de Fitbit Web (heredada) | API de Google Health (Google-Identity) |
| Extremo del token | https://api.fitbit.com/oauth2/token | https://oauth2.googleapis.com/token |
| Biblioteca de autenticación | Código abierto estándar | Google Auth |
| Alcance | actividad | https://www.googleapis.com/auth/googlehealth.activity_and_fitness |
| ID de usuario | ID codificado de Fitbit que se muestra en la respuesta de /oauth2/token | ID de usuario que se devuelve desde el extremo users.getIdentity |
4. Lista de tareas de retención
- Persistencia de sesión: No borres la sesión anterior de la API de Fitbit Web del usuario hasta que se verifique correctamente el access_token de la API de Google Health y se guarde en tu base de datos.
- Revocación automática: Una vez que se complete la migración de la API de Google Health, usa una solicitud POST al extremo de revocación heredado de Fitbit: https://api.fitbit.com/oauth2/revoke. Esto garantiza que el usuario no vea permisos de apps "duplicados" en la configuración de Fitbit.
- Control de errores: Si una llamada a Fitbit devuelve un error 401 Unauthorized, se redirecciona automáticamente al flujo de OAuth de Google en lugar de mostrar un mensaje de error.