🌟 Nora API Documentation

AI-Powered Health & Wellness API

🔐 Authentication

All API endpoints (except public routes) require Firebase Authentication.

Base URL: https://api-xptzsvmqoa-nn.a.run.app
Authentication: Firebase ID Token (Bearer Token)
Region: North America (northamerica-northeast1)

Request Headers

Authorization: Bearer <FIREBASE_ID_TOKEN> Content-Type: application/json

Getting an ID Token

Use Firebase Auth SDK to obtain an ID token:

// JavaScript/TypeScript const token = await firebase.auth().currentUser.getIdToken(); // Swift (iOS) let token = try await Auth.auth().currentUser?.getIDToken()

👤 User Profile

Manage user profile data with encrypted PII/PHI fields.

GET /v1/user/profile Auth Required

Retrieve the current user's profile (decrypted).

Response (200 OK)

{ "success": true, "data": { "uid": "abc123", "name": "John Doe", "email": "john@example.com", "age": 30, "unitPreference": "metric", "height": 175.0, "weight": 75.5, "targetWeight": 70.0, "biologicalSex": "Male", "nutritionGoal": "Fat Loss", "dailyCaloriesTarget": 2000, "proteinTarget": 150.0, "carbsTarget": 200.0, "fatTarget": 60.0, "fiberTarget": 30.0, "dailyActiveEnergyTarget": 500.0, "dailyExerciseMinutesTarget": 30, "weeklyExerciseSessionsTarget": 5, "dailyStepsTarget": 10000, "isUsingCustomExerciseTargets": false, "createdAt": "2025-01-01T00:00:00.000Z", "updatedAt": "2025-01-05T00:00:00.000Z" } }
POST /v1/user/profile Auth Required

Create a new user profile with comprehensive health data.

Request Body (All Fields Optional Except name & email)

Field Type Description
name string User's full name (encrypted)
email string User's email address (encrypted)
phone string Phone number (encrypted)
dateOfBirth string ISO date string (encrypted)
timezone string User's timezone (e.g., "America/Toronto")
authProvider string Auth method: "password", "google.com", "apple.com"
age number User's age (1-150)
unitPreference enum "metric" or "imperial"
height number Height in cm (metric) or inches (imperial) - encrypted
weight number Current weight in kg or lbs - encrypted
targetWeight number Target weight in kg or lbs
biologicalSex string "Male", "Female", or "Other"
goalPace string Weight loss pace: "Aggressive", "Moderate", "Conservative"
dietPreference string Diet type: "Classic", "Keto", "Paleo", "Vegan", etc.
workoutFrequency string "1-2", "3-4", "5-6", "7" days per week
activityLevel string Activity factor: "1.2", "1.375", "1.55", "1.725", "1.9"
nutritionGoal string "Fat Loss", "Muscle Gain", "Maintenance", "Recomp"
allergies array List of food allergies - encrypted
dietIntensity string Diet intensity description

Macro & Micronutrient Targets

Daily nutritional targets (all numbers, in grams or specified units):

  • proteinTarget (g)
  • carbsTarget (g)
  • fatTarget (g)
  • fiberTarget (g)
  • waterTarget (ml)
  • vitaminATarget (mcg)
  • vitaminB1Target (mg)
  • vitaminB2Target (mg)
  • vitaminB3Target (mg)
  • vitaminB6Target (mg)
  • vitaminB12Target (mcg)
  • vitaminCTarget (mg)
  • vitaminDTarget (mcg)
  • vitaminETarget (mg)
  • vitaminKTarget (mcg)
  • calciumTarget (mg)
  • ironTarget (mg)
  • magnesiumTarget (mg)
  • potassiumTarget (mg)
  • sodiumTarget (mg)
  • zincTarget (mg)
  • folateTarget (mcg)
  • Exercise Targets

    Daily and weekly exercise goals (all optional):

  • dailyActiveEnergyTarget (kcal/day) - Active calories burned goal
  • dailyExerciseMinutesTarget (min/day) - Exercise duration goal
  • weeklyExerciseSessionsTarget (sessions/week) - Workout frequency goal
  • dailyStepsTarget (steps/day) - Step count goal (default: 10,000)
  • isUsingCustomExerciseTargets (boolean) - Custom vs auto-calculated targets
  • Example Request

    { "name": "John Doe", "email": "john@example.com", "age": 30, "unitPreference": "metric", "height": 175.0, "weight": 75.5, "targetWeight": 70.0, "biologicalSex": "Male", "goalPace": "Moderate", "dietPreference": "Classic", "workoutFrequency": "3-4", "nutritionGoal": "Fat Loss", "activityLevel": "1.55", "proteinTarget": 150.0, "carbsTarget": 200.0, "fatTarget": 60.0, "fiberTarget": 30.0, "vitaminATarget": 900.0, "vitaminB1Target": 1.2, "vitaminB6Target": 1.3, "vitaminCTarget": 90.0, "calciumTarget": 1000.0, "ironTarget": 8.0, "dailyActiveEnergyTarget": 500.0, "dailyExerciseMinutesTarget": 30, "weeklyExerciseSessionsTarget": 5, "dailyStepsTarget": 10000, "isUsingCustomExerciseTargets": false }

    Response (201 Created)

    { "success": true, "message": "User profile created successfully", "data": { "uid": "abc123", ...profile data with all fields... } }
    âš ī¸ Important:
    • Profile creation automatically initializes daily quota at users/{uid}/quota/current
    • All PII/PHI fields are encrypted at rest using KMS envelope encryption
    • Returns 409 Conflict if profile already exists
    PUT /v1/user/profile Auth Required

    Update user profile (partial updates supported).

    Request Body (All Fields Optional)

    Same schema as POST, but all fields are optional. Only provided fields will be updated.

    Example: Update Exercise Targets

    { "dailyStepsTarget": 15000, "dailyExerciseMinutesTarget": 45, "weeklyExerciseSessionsTarget": 6, "isUsingCustomExerciseTargets": true }

    Response (200 OK)

    { "success": true, "message": "User profile updated successfully", "data": { ...complete updated profile... } }

    â¤ī¸ Health Snapshots

    Track health metrics over time. All PHI fields are encrypted.

    GET /v1/health/snapshots Auth Required

    Retrieve health snapshots with optional filtering.

    Query Parameters

    Parameter Type Description
    startDate string Filter from this date (ISO format)
    endDate string Filter to this date (ISO format)
    limit number Max records to return (default: 50, max: 100)

    Response (200 OK)

    { "success": true, "data": [ { "id": "hs_abc123xyz789", "userId": "user_123", "date": "2025-01-05", // Sleep metrics "sleepDurationHours": 7.5, "sleepStartTime": "2025-01-04T23:30:00Z", "sleepEndTime": "2025-01-05T07:00:00Z", "deepSleepPercentage": 18.0, "remSleepPercentage": 22.0, "coreSleepPercentage": 60.0, // Activity metrics "steps": 12453, "distanceWalkedKm": 8.7, "activeEnergyBurned": 542.3, "exerciseMinutes": 45, "standHours": 11, // Heart metrics "restingHeartRate": 58.0, "averageHeartRate": 72.0, "heartRateVariability": 45.2, // Body measurements "weight": 75.5, "bmi": 23.8, // Nutrition "dietaryEnergy": 2100.0, "dietaryWater": 2500.0, // Metadata "dataCompleteness": 0.89, "createdAt": "2025-01-05T08:00:00.000Z", "updatedAt": "2025-01-05T08:00:00.000Z" } ], "count": 1 }
    POST /v1/health/snapshots Auth Required

    Create a daily health snapshot from HealthKit data. All 19 fields are optional except date.

    Request Body - HealthKit Fields

    Field Type Required Description
    📅 Required
    date string ✅ ISO date string (YYYY-MM-DD)
    😴 Sleep Metrics (7 fields)
    sleepDurationHours number ❌ Total sleep time in hours (encrypted)
    sleepStartTime string ❌ Sleep start time (ISO 8601 timestamp, encrypted)
    sleepEndTime string ❌ Sleep end time (ISO 8601 timestamp, encrypted)
    deepSleepPercentage number ❌ % of sleep in deep stage (0-100, encrypted)
    remSleepPercentage number ❌ % of sleep in REM stage (0-100, encrypted)
    coreSleepPercentage number ❌ % of sleep in core/light stage (0-100, encrypted)
    🏃 Activity Metrics (5 fields)
    steps integer ❌ Daily step count (encrypted)
    distanceWalkedKm number ❌ Distance walked/run in kilometers (encrypted)
    activeEnergyBurned number ❌ Active calories burned in kcal (encrypted)
    exerciseMinutes integer ❌ Apple Exercise Ring minutes (encrypted)
    standHours integer ❌ Apple Stand Ring hours (encrypted)
    â¤ī¸ Heart Metrics (3 fields)
    restingHeartRate number ❌ Lowest sustained heart rate in bpm (encrypted)
    averageHeartRate number ❌ Mean heart rate for day in bpm (encrypted)
    heartRateVariability number ❌ HRV SDNN measurement in ms (encrypted)
    âš–ī¸ Body Measurements (2 fields)
    weight number ❌ Body weight in kg or lbs (encrypted)
    bmi number ❌ Body Mass Index (encrypted)
    🍎 Nutrition (2 fields)
    dietaryEnergy number ❌ Total calories consumed in kcal (encrypted)
    dietaryWater number ❌ Total water intake in ml (encrypted)
    📊 Metadata (1 field)
    dataCompleteness number ❌ Score 0.0-1.0 indicating % of fields populated
    🔮 Future Fields (not yet collected)
    bloodPressure object ❌ {systolic: number, diastolic: number} (encrypted)
    glucose number ❌ Blood glucose in mg/dL (encrypted)
    healthNotes string ❌ Free-form notes (encrypted)

    Example Request

    { "date": "2025-01-15", // Sleep metrics "sleepDurationHours": 7.5, "sleepStartTime": "2025-01-14T23:30:00Z", "sleepEndTime": "2025-01-15T07:00:00Z", "deepSleepPercentage": 18.0, "remSleepPercentage": 22.0, "coreSleepPercentage": 60.0, // Activity metrics "steps": 12453, "distanceWalkedKm": 8.7, "activeEnergyBurned": 542.3, "exerciseMinutes": 45, "standHours": 11, // Heart metrics "restingHeartRate": 58.0, "averageHeartRate": 72.0, "heartRateVariability": 45.2, // Body measurements "weight": 75.5, "bmi": 23.8, // Nutrition "dietaryEnergy": 2100.0, "dietaryWater": 2500.0, // Metadata "dataCompleteness": 0.89 }

    Response (201 Created)

    { "success": true, "message": "Health snapshot created successfully", "data": { "id": "hs_abc123xyz789", "date": "2025-01-15", "createdAt": "2025-01-15T12:00:00.000Z" } }
    PUT /v1/health/snapshots/:id Auth Required

    Update an existing health snapshot (partial updates supported).

    DELETE /v1/health/snapshots/:id Auth Required

    Soft delete a health snapshot (sets deletedAt timestamp).

    🍎 Diet Logs

    Track meals and nutritional intake.

    GET /v1/diet/logs Auth Required

    Retrieve diet logs with optional date filtering.

    Query Parameters

    Same as health snapshots: startDate, endDate, limit

    Response (200 OK)

    { "success": true, "data": [ { "id": "log_ai_123", "date": "2025-01-05", "mealType": "lunch", "identifiedFood": [ { "foodName": "Grilled Chicken Breast", "amountInGram": 150, "calories": 165, "nutrients": { "macronutrients": [ {"type": "Protein", "amountInGram": 31}, {"type": "Fat", "amountInGram": 3.6} ], "micronutrients": [ {"type": "VitaminB6", "amount": 0.5} ] } } ], "calories": 165, "servingSize": 150, "title": "Grilled Chicken Breast", "summary": "Lean protein source", "recommendation": "Great for muscle building", "photoIds": ["photo123"], "createdAt": "2025-01-05T12:30:00.000Z", "updatedAt": "2025-01-05T12:30:00.000Z" }, { "id": "log_legacy_456", "date": "2025-01-05", "mealType": "breakfast", "mealDescription": "Oatmeal with berries", "totalCalories": 350, "totalMacros": { "protein": 12, "carbs": 58, "fat": 8, "fiber": 10 }, "foods": [ { "foodId": "food123", "name": "Oatmeal", "quantity": 100, "unit": "g", "calories": 300, "macros": { "protein": 10, "carbs": 50, "fat": 6, "fiber": 8 } } ], "notes": "Healthy start", "createdAt": "2025-01-05T08:00:00.000Z", "updatedAt": "2025-01-05T08:00:00.000Z" } ], "count": 2 }
    POST /v1/diet/logs Auth Required

    Create a new diet log entry from AI photo analysis. All entries must include AI-identified foods with complete nutritional data.

    Request Body

    Field Type Required Description
    date string ✅ ISO date string
    mealType enum ✅ "breakfast", "lunch", "dinner", "snack"
    identifiedFood array ✅ Array of AI-identified food items with nutrients
    calories number ✅ Total meal calories
    servingSize number ✅ Total serving size in grams
    title string ❌ AI-generated meal title (encrypted)
    summary string ❌ AI analysis summary (encrypted)
    recommendation string ❌ AI dietary recommendations (encrypted)
    notes string ❌ User notes (encrypted)
    photoIds array ❌ Array of photo IDs

    AI Format Food Item Schema

    { "foodName": "Grilled Chicken Breast", "amountInGram": 150, "calories": 165, "nutrients": { "macronutrients": [ {"type": "Protein", "amountInGram": 31}, {"type": "Fat", "amountInGram": 3.6}, {"type": "Carbs", "amountInGram": 0}, {"type": "Fiber", "amountInGram": 0} ], "micronutrients": [ {"type": "VitaminB6", "amount": 0.5}, {"type": "Iron", "amount": 0.9}, {"type": "Zinc", "amount": 1.0} ] } }

    Micronutrient Types: VitaminA, VitaminB1, VitaminB2, VitaminB3, VitaminB6, VitaminB12, VitaminC, VitaminD, VitaminE, VitaminK, Calcium, Iron, Magnesium, Potassium, Sodium, Zinc, Folate

    Example Request

    { "date": "2025-12-06", "mealType": "lunch", "identifiedFood": [ { "foodName": "Grilled Chicken Breast", "amountInGram": 150, "calories": 165, "nutrients": { "macronutrients": [ {"type": "Protein", "amountInGram": 31}, {"type": "Fat", "amountInGram": 3.6}, {"type": "Carbs", "amountInGram": 0} ], "micronutrients": [ {"type": "VitaminB6", "amount": 0.5}, {"type": "Iron", "amount": 0.9} ] } }, { "foodName": "Brown Rice", "amountInGram": 100, "calories": 112, "nutrients": { "macronutrients": [ {"type": "Carbs", "amountInGram": 24}, {"type": "Protein", "amountInGram": 2.6}, {"type": "Fat", "amountInGram": 0.9}, {"type": "Fiber", "amountInGram": 1.8} ] } } ], "calories": 277, "servingSize": 250, "title": "Grilled Chicken with Brown Rice", "summary": "A balanced meal with lean protein and complex carbs", "recommendation": "Great choice for muscle recovery post-workout", "photoIds": ["photo_abc123"] }

    Response (201 Created)

    { "success": true, "data": { "id": "log_abc123", "createdAt": "2025-12-06T12:30:00.000Z" } }
    PUT /v1/diet/logs/:id Auth Required

    Update an existing diet log.

    DELETE /v1/diet/logs/:id Auth Required

    Soft delete a diet log.

    🔄 Sync & Restore

    Bulk data operations for app reinstall and device migration. Note: Health data is managed by HealthKit and is not restored via this API.

    GET /v1/sync/status Auth Required

    Get sync status and data summary for the current user.

    Response (200 OK)

    { "success": true, "data": { "profile": 1, "dietLogs": 120, "insights": 30, "photos": 200, "achievements": 15, "lastSyncedAt": "2025-01-05T10:00:00.000Z" } }
    POST /v1/sync/restore Auth Required

    Restore user profile, diet logs, insights, photos, and achievements. Health data is managed by HealthKit and is not restored via this endpoint.

    âš ī¸ Rate Limiting: This endpoint is heavily rate-limited (1 request per 15 minutes) to prevent abuse.
    â„šī¸ Achievements: Returns user achievement progress data (completion status, timestamps). Achievement definitions are stored in Remote Config and fetched by the iOS app independently. See Achievements section for data structure details.

    Request Body

    Field Type Default Description
    dataTypes array All types ["profile", "diet", "insights", "photos", "achievements"]
    startDate string - Filter data from this date
    endDate string - Filter data to this date
    chunkSize number 100 Records per chunk (10-500)

    Example Request

    { "dataTypes": ["profile", "diet"], "chunkSize": 100 }

    Response (200 OK)

    { "success": true, "data": { "profile": {...}, "dietLogs": [...], "insights": [...], "photos": [...], "achievements": [...], "totalRecords": 245, "hasMore": false }, "partial": false, "warnings": [] }

    📊 Daily Quota

    Monitor AI analysis usage limits.

    GET /v1/quota/status Auth Required

    Check current daily quota status.

    Response (200 OK)

    { "success": true, "data": { "date": "2025-01-05", "tier": "free", "analysisCount": 2, "analysisLimit": 3, "remaining": 1, "resetsAt": "2025-01-06T00:00:00.000Z", "exceeded": false } }
    Quota Tiers:
    â€ĸ Free: 3 AI analyses per day
    â€ĸ Premium: 5 AI analyses per day
    â€ĸ Pro: 10 AI analyses per day

    🏆 Achievements

    Track user accomplishments and milestones through gamification.

    📊 Achievement System Architecture

    Achievement Flow:

    1. Definitions Storage: Achievement templates stored in Firebase Remote Config (achievement_definitions parameter)
    2. iOS Fetch: App fetches definitions on launch and every 6 hours
    3. Local Tracking: Progress tracked in Core Data on device
    4. Backend Sync: Achievement progress synced to Firestore achievements collection
    5. Restoration: Progress restored via /v1/sync/restore during app reinstall/device migration

    Data Separation:

    • Remote Config: Stores achievement definitions (title, description, criteria, rewards) - managed by admin
    • Firestore: Stores user progress (earned achievements, completion status, timestamps)
    • iOS Core Data: Local storage for real-time progress tracking

    Version Support:

    • v1 (Legacy): Simple criteria with criteriaAction (e.g., "meal_logged")
    • v2 (Current): Structured nutrition criteria with nutritionCriteria object

    Achievement Progress Object (User Data)

    Structure of achievement progress data returned from sync/restore endpoints.

    Field Type Description
    id string Unique document ID in Firestore
    userId string User who earned/is progressing toward this achievement
    achievementId string References achievement definition in Remote Config
    progress number Current progress value (e.g., 5 out of 7 days)
    isCompleted boolean Whether achievement has been unlocked
    earnedAt string | null ISO timestamp when achievement was completed (null if in-progress)
    lastUpdated string ISO timestamp of last progress update
    createdAt string ISO timestamp when achievement tracking started

    Achievement Categories

    Category Description Example
    consistency Daily/weekly logging streaks and habit building "Log meals for 7 consecutive days"
    nutrition Macro/micro balance and healthy eating patterns "Meet protein target for 5 days"
    discovery Food variety and trying new cuisines "Log 50 unique food items"
    progress Weight goals and health metric improvements "Reach target weight"

    Recurrence Types

    Type Description Reset Behavior
    lifetime One-time achievement, never resets Once earned, stays earned forever
    daily Resets at midnight each day Progress resets to 0 daily
    weekly Resets every Monday Progress resets to 0 weekly
    monthly Resets on the 1st of each month Progress resets to 0 monthly

    Example 1: Completed Lifetime Achievement

    { "id": "doc_abc123", "userId": "user_456", "achievementId": "week_warrior_7", "progress": 7, "isCompleted": true, "earnedAt": "2025-01-05T12:34:56.000Z", "lastUpdated": "2025-01-05T12:34:56.000Z", "createdAt": "2025-01-01T08:00:00.000Z" }

    This achievement is complete (isCompleted: true) with an earnedAt timestamp.

    Example 2: In-Progress Daily Achievement

    { "id": "doc_xyz789", "userId": "user_456", "achievementId": "protein_power_daily", "progress": 4, "isCompleted": false, "earnedAt": null, "lastUpdated": "2025-01-06T18:22:13.000Z", "createdAt": "2025-01-03T09:15:30.000Z" }

    This achievement is in progress (progress: 4 out of required target) and has not been earned yet (earnedAt: null).

    Example 3: Array of Mixed Achievements (from /v1/sync/restore)

    { "success": true, "data": { "profile": {...}, "dietLogs": [...], "insights": [...], "photos": [...], "achievements": [ { "id": "doc_abc123", "userId": "user_456", "achievementId": "week_warrior_7", "progress": 7, "isCompleted": true, "earnedAt": "2025-01-05T12:34:56.000Z", "lastUpdated": "2025-01-05T12:34:56.000Z", "createdAt": "2025-01-01T08:00:00.000Z" }, { "id": "doc_xyz789", "userId": "user_456", "achievementId": "protein_power_daily", "progress": 4, "isCompleted": false, "earnedAt": null, "lastUpdated": "2025-01-06T18:22:13.000Z", "createdAt": "2025-01-03T09:15:30.000Z" } ], "totalRecords": 2, "hasMore": false }, "partial": false, "warnings": [] }

    Achievements are returned as part of the /v1/sync/restore response when "achievements" is included in the dataTypes array.

    Achievement Definition Schema (Remote Config - Reference Only)

    Achievement definitions are stored in Firebase Remote Config and managed via admin console. This schema is for reference only - users retrieve progress via sync/restore API.

    Field Type Description
    id string Unique achievement identifier (referenced by achievementId in progress data)
    version number Schema version (1 = legacy, 2 = nutrition criteria)
    title string Display title (3-50 characters)
    description string User-facing description (10-200 characters)
    icon string SF Symbol name (e.g., "flame.fill", "star.fill")
    category enum One of: consistency, nutrition, discovery, progress
    targetValue number Required value to unlock (1-10000)
    rewardPoints number Points awarded on completion (1-1000)
    criteriaType enum How achievement is tracked: consecutive_days, meal_count, nutrition_target, unique_items, etc.
    recurrenceType enum Reset frequency: lifetime, daily, weekly, monthly
    isEnabled boolean Whether achievement is active

    Note: Achievement definitions are fetched by iOS app from Remote Config. The sync/restore API only returns user progress data.

    Nutrition Criteria (v2.0 Achievements)

    Version 2 achievements support structured nutrition tracking with specific nutrients and accumulation types.

    Supported Nutrients

    Macronutrients:
    • protein (g)
    • carbohydrates (g)
    • fat (g)
    • fiber (g)
    • sugar (g)
    Micronutrients:
    • sodium (mg)
    • potassium (mg)
    • calcium (mg)
    • iron (mg)
    • magnesium (mg)
    • vitaminA (mcg)
    • vitaminB6 (mg)
    • vitaminB12 (mcg)
    • vitaminC (mg)
    • vitaminD (mcg)
    • vitaminE (mg)
    • zinc (mg)
    • folate (mcg)

    Accumulation Types

    Type Description Example
    daily_target Hit target amount each qualifying day "Hit 150g protein daily for 7 days"
    cumulative_total Accumulate total amount over lifetime "Accumulate 5000mg calcium total"
    single_meal Hit target in one meal "Consume 50g protein in one meal"

    âš ī¸ Error Codes

    Standard HTTP error responses.

    Code Error Description
    400 Bad Request Invalid request body or parameters
    401 Unauthorized Missing or invalid authentication token
    403 Forbidden Insufficient permissions or quota exceeded
    404 Not Found Resource does not exist
    409 Conflict Resource already exists
    429 Too Many Requests Rate limit exceeded
    500 Internal Server Error Server error (contact support)

    Error Response Format

    { "error": "Validation Error", "message": "Invalid input data", "details": [ { "field": "email", "message": "Invalid email format" } ] }

    🔗 Additional Endpoints

    GET /health Public

    API health check endpoint.

    GET /v1/food/search Auth Required

    Search food database by name or barcode.

    POST /v1/insights/generate Auth Required

    Generate AI-powered health insights.

    POST /v1/photos/upload Auth Required

    Upload food photos for AI analysis.

    🔒 Data Security & Privacy

    Encryption:
    â€ĸ All PII (Personally Identifiable Information) fields are encrypted at rest using Google Cloud KMS
    â€ĸ PHI (Protected Health Information) is encrypted using envelope encryption
    â€ĸ Data is encrypted in transit using TLS 1.3

    Audit Logging:
    â€ĸ All data access is logged to Cloud Logging
    â€ĸ Includes: timestamp, user ID, IP address, operation type, fields accessed
    â€ĸ Logs are retained for compliance and security monitoring

    Data Retention:
    â€ĸ Active user data: Retained indefinitely
    â€ĸ Soft-deleted data: Anonymized after 30 days
    â€ĸ Audit logs: Retained for 90 days
    â€ĸ Anonymized data: Available for ML training (with user consent)