ওয়েবহুক সাবস্ক্রিপশন

Google Health API আপনার অ্যাপ্লিকেশনকে রিয়েল-টাইম বিজ্ঞপ্তি পেতে দেয় যখন কোনও ব্যবহারকারীর স্বাস্থ্য ডেটা পরিবর্তিত হয়। পরিবর্তনের জন্য পোলিং করার পরিবর্তে, Google Health API-তে ডেটা উপলভ্য হওয়ার সাথে সাথেই আপনার সার্ভার HTTPS POST অনুরোধ ওয়েবহুক পায়।

যেসব ডেটার ধরন কাজ করে

নিম্নলিখিত ধরনের ডেটার জন্য ওয়েবহুক বিজ্ঞপ্তি কাজ করে:

টেবিল: ওয়েবহুক সাপোর্ট সহ Google Health API ডেটার ধরন
ডেটার ধরন উপলভ্য
অপারেশন
সুযোগ
অ্যাক্টিভ মিনিট
dataType: active-minutes
filter parameter: active_minutes
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট

মানানসই ডিভাইস

  • Fitbit Air
  • Fitbit Alta
  • Fitbit Alta HR
  • Fitbit Blaze
  • Fitbit Charge 2
  • Fitbit Charge 3
  • Fitbit Flex 2
  • Fitbit Inspire
  • Fitbit Inspire HR
  • Pixel Watch 4
list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
অ্যাক্টিভ জোন মিনিট
dataType: active-zone-minutes
filter parameter: active_zone_minutes
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট

মানানসই ডিভাইস

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
অ্যাক্টিভিটি লেভেল
dataType: activity-level
filter parameter: activity_level
রেকর্ডের ধরন: ইন্টারভাল
তালিকা, রিকনসাইল করুন .activity_and_fitness.readonly
.activity_and_fitness.writeonly
উচ্চতা
dataType: altitude
filter parameter: altitude
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট
list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
রক্তের গ্লুকোজ সংক্রান্ত ডেটা
dataType: blood-glucose
filter parameter: blood_glucose
রেকর্ডের ধরন: স্যাম্পেল
list, get, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
শরীরে থাকা ফ্যাট
dataType: body-fat
filter parameter: body_fat
রেকর্ডের ধরন: স্যাম্পেল

মানানসই ডিভাইস

list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
হার্ট রেট জোনে ক্যালোরি
dataType: calories-in-heart-rate-zone
filter parameter: calories_in_heart_rate_zone
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট
rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
দৈনিক হার্ট রেটের তারতম্য
dataType: daily-heart-rate-variability
filter parameter: daily_heart_rate_variability
রেকর্ডের ধরন: দৈনিক

মানানসই ডিভাইস

তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
দৈনিক হার্ট রেট জোন
dataType: daily-heart-rate-zones
filter parameter: daily_heart_rate_zones
রেকর্ডের ধরন: দৈনিক
তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
দৈনিক অক্সিজেন স্যাচুরেশনের মাত্রা
dataType: daily-oxygen-saturation
filter parameter: daily_oxygen_saturation
রেকর্ডের ধরন: দৈনিক

মানানসই ডিভাইস

তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
দৈনিক শ্বাস-প্রশ্বাসের হার
dataType: daily-respiratory-rate
filter parameter: daily_respiratory_rate
রেকর্ডের ধরন: দৈনিক

মানানসই ডিভাইস

তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
দৈনিক বিশ্রামকালীন হার্ট রেট
dataType: daily-resting-heart-rate
filter parameter: daily_resting_heart_rate
রেকর্ডের ধরন: দৈনিক

মানানসই ডিভাইস

তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
ঘুমের সময় শরীরের তাপমাত্রার দৈনিক পরিবর্তন
dataType: daily-sleep-temperature-derivations
filter parameter: daily_sleep_temperature_derivations
রেকর্ডের ধরন: দৈনিক

মানানসই ডিভাইস

তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
দূরত্ব
dataType: distance
filter parameter: distance
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট

মানানসই ডিভাইস

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
ব্যায়াম
dataType: exercise
filter parameter: exercise
রেকর্ডের ধরন: সেশন

মানানসই ডিভাইস

list, get, reconcile, create, update, batchDelete .activity_and_fitness.readonly
.activity_and_fitness.writeonly
ফ্লোর
dataType: floors
filter parameter: floors
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট
reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
হার্ট রেট
dataType: heart-rate
filter parameter: heart_rate
রেকর্ডের ধরন: স্যাম্পেল
স্টোরেজ রেজোলিউশন: ১ সেকেন্ড

মানানসই ডিভাইস

list, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
হার্ট রেটের তারতম্য
dataType: heart-rate-variability
filter parameter: heart_rate_variability
রেকর্ডের ধরন: স্যাম্পেল

মানানসই ডিভাইস

তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
উচ্চতা
dataType: height
filter parameter: height
রেকর্ডের ধরন: স্যাম্পেল
list, get, reconcile, create, update, batchDelete .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
হাইড্রেশন লগ
dataType: hydration-log
filter parameter: hydration_log
রেকর্ডের ধরন: সেশন
list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .nutrition.readonly
.nutrition.writeonly
পুষ্টির লগ
dataType: nutrition-log
filter parameter: nutrition_log
রেকর্ডের ধরন: সেশন

মানানসই ডিভাইস

list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .nutrition.readonly
.nutrition.writeonly
শ্বাস-প্রশ্বাসের হার সংক্রান্ত স্লিপ সামারি
dataType: respiratory-rate-sleep-summary
filter parameter: respiratory_rate_sleep_summary
রেকর্ডের ধরন: স্যাম্পেল

মানানসই ডিভাইস

তালিকা, রিকনসাইল করুন .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
সর্বোচ্চ VO2-এর ডেটা রান করুন
dataType: run-vo2-max
filter parameter: run_vo2_max
রেকর্ডের ধরন: স্যাম্পেল

মানানসই ডিভাইস

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
বসে থাকার সময়
dataType: sedentary-period
filter parameter: sedentary_period
রেকর্ডের ধরন: ইন্টারভাল

মানানসই ডিভাইস

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
স্লিপ
dataType: sleep
filter parameter: sleep
রেকর্ডের ধরন: সেশন

মানানসই ডিভাইস

list, get, reconcile, create, update, batchDelete .sleep.readonly
.sleep.writeonly
ধাপ
dataType: steps
filter parameter: steps
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট

মানানসই ডিভাইস

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
হার্ট রেট জোনে কাটানো সময়
dataType: time-in-heart-rate-zone
filter parameter: time_in_heart_rate_zone
রেকর্ডের ধরন: ইন্টারভাল
স্টোরেজ সংক্রান্ত সমস্যার সমাধান: ১ মিনিট
list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
ওজন
dataType: weight
filter parameter: weight
রেকর্ডের ধরন: স্যাম্পেল

মানানসই ডিভাইস

list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly

বিজ্ঞপ্তির স্কোপ

ব্যবহারকারী সংশ্লিষ্ট স্কোপের একটির জন্য সম্মতি দিলে তবেই এই ধরনের ডেটার জন্য বিজ্ঞপ্তি পাঠানো হয়:

  • অ্যাক্টিভিটি, যার মধ্যে অ্যাক্টিভ মিনিট, স্টেপ, উচ্চতা, দূরত্ব ও ফ্লোর ডেটার ধরন অন্তর্ভুক্ত:
    • https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
    • https://www.googleapis.com/auth/googlehealth.activity_and_fitness.writeonly
  • হেল্থ মেট্রিক, যা ওজনের ডেটা টাইপ কভার করে:
    • https://www.googleapis.com/auth/googlehealth.health_metrics_and_measurements.readonly
    • https://www.googleapis.com/auth/googlehealth.health_metrics_and_measurements.writeonly
  • ঘুম, যা ঘুমের ডেটার ধরন কভার করে:
    • https://www.googleapis.com/auth/googlehealth.sleep.readonly
    • https://www.googleapis.com/auth/googlehealth.sleep.writeonly

IAM পরিষেবা অ্যাকাউন্ট

প্রয়োজন না হলেও, Google Health API-এর জন্য সাবস্ক্রাইবার কনফিগার করার সময় আমরা IAM পরিষেবা অ্যাকাউন্ট ব্যবহার করার সাজেশন দিই। পরিষেবা অ্যাকাউন্ট নিম্নলিখিত ফিচারের মাধ্যমে স্ট্যান্ডার্ড ব্যবহারকারীর অ্যাকাউন্টের তুলনায় অ্যাপ্লিকেশন ওয়ার্কলোডের জন্য আরও ভালো নিরাপত্তা প্রদান করে:

  • অটোমেটেড স্বল্প-মেয়াদী ক্রেডেনশিয়াল: Google Cloud এক্সিকিউশন এনভায়রনমেন্টের (যেমন Compute Engine, Cloud Run বা Google Kubernetes Engine) সাথে অ্যাটাচ করা থাকলে, পরিষেবা অ্যাকাউন্ট অটোমেটিক সুরক্ষিত, স্বল্প-মেয়াদী ক্রেডেনশিয়াল পায় ও রোটেট করে। এটি পারসিস্টেন্ট স্ট্যাটিক কী ম্যানেজ ও স্টোর করার ঝুঁকি কমায়।
  • ন্যূনতম বিশেষাধিকারের নীতি: পরিষেবা অ্যাকাউন্টগুলি কাজের চাপের জন্য ডেডিকেটেড পরিচয় প্রদান করে। আপনি তাদের শুধুমাত্র সাবস্ক্রাইবার এন্ডপয়েন্ট ম্যানেজ করার জন্য প্রয়োজনীয় নির্দিষ্ট অনুমতি দিতে পারেন, যাতে আপনার Google Cloud রিসোর্সে ব্যাপক অ্যাক্সেস এড়ানো যায়।
  • লাইফসাইকেলের স্বাধীনতা: পরিষেবা অ্যাকাউন্টগুলি কোনও স্বতন্ত্র ব্যবহারকারীর অ্যাকাউন্ট থেকে স্বাধীনভাবে কাজ করে, যা নিশ্চিত করে যে কর্মীদের পরিবর্তন দীর্ঘমেয়াদী যাচাইকরণের স্থিতিশীলতাকে প্রভাবিত করবে না।

পরিষেবা অ্যাকাউন্ট সেট-আপ করা

পরিষেবা অ্যাকাউন্ট ব্যবহার করে যাচাই করার জন্য আপনার সাবস্ক্রাইবার অ্যাপ্লিকেশন কনফিগার করতে:

  1. পরিষেবা অ্যাকাউন্ট তৈরি করুন: Google Cloud কনসোলে, ব্যবহারকারী-পরিচালিত নতুন পরিষেবা অ্যাকাউন্ট তৈরি করতে আপনার প্রোজেক্টের IAM ও অ্যাডমিন পৃষ্ঠায় নেভিগেট করুন।
  2. প্রয়োজনীয় IAM ভূমিকা প্রদান করুন: আপনার Google Cloud প্রোজেক্টে সাবস্ক্রাইবারদের ম্যানেজ করার জন্য পরিষেবা অ্যাকাউন্টকে উপযুক্ত ভূমিকা অ্যাসাইন করুন ।
  3. আপনার ওয়ার্কলোডে পরিষেবা অ্যাকাউন্ট অ্যাটাচ করুন: নতুন পরিষেবা অ্যাকাউন্ট হিসেবে রান করার জন্য আপনার সাবস্ক্রাইবার লজিক হোস্ট করা এনভায়রনমেন্ট কনফিগার করুন। এটি আপনার অ্যাপ্লিকেশন কোডকে (যেমন Google API ক্লায়েন্ট লাইব্রেরি) projects.subscribers REST API কল করার সময় পরিষেবা অ্যাকাউন্টের স্বল্পকালীন ক্রেডেনশিয়াল স্বয়ংক্রিয়ভাবে শনাক্ত করতে এবং ব্যবহার করতে দেয়।

CPE সংক্রান্ত ভূমিকা

Google Health API সাবস্ক্রাইবার বা সাবস্ক্রিপশন ম্যানেজ করতে, আপনাকে অবশ্যই API কল করা ছদ্মবেশী পরিষেবা অ্যাকাউন্টকে উপযুক্ত ভূমিকা প্রদান করতে হবে। প্রয়োজনীয় অ্যাক্সেস লেভেলের উপর নির্ভর করে, নিম্নলিখিত ভূমিকাগুলির মধ্যে একটি অ্যাসাইন করুন:

  • Google Health API Read
  • Google Health API এডিটর
  • Google Health API Admin

Google Health API IAM ভূমিকা ও অনুমতি সম্পর্কে আরও জানুন।

সাবস্ক্রাইবারদের ম্যানেজ করা

বিজ্ঞপ্তি পাওয়ার আগে, আপনাকে একজন সাবস্ক্রাইবার রেজিস্টার করতে হবে, যিনি আপনার অ্যাপ্লিকেশনের বিজ্ঞপ্তি এন্ডপয়েন্টকে উপস্থাপন করেন। আপনি projects.subscribers-এ উপলভ্য REST API ব্যবহার করে সাবস্ক্রাইবারদের ম্যানেজ করতে পারবেন।

আপনার সাবস্ক্রাইবার এন্ডপয়েন্টকে অবশ্যই HTTPS (TLSv1.2+) ব্যবহার করতে হবে এবং সর্বজনীনভাবে অ্যাক্সেসযোগ্য হতে হবে। সাবস্ক্রাইবার তৈরি ও আপডেট করার সময়, আপনি এন্ডপয়েন্ট URI-এর মালিক কিনা তা নিশ্চিত করতে Google Health API যাচাইকরণ চ্যালেঞ্জ পারফর্ম করে। যাচাইকরণ ব্যর্থ হলে, সাবস্ক্রাইবার তৈরি ও আপডেট করার অপারেশন FailedPreconditionException-এর সাথে ব্যর্থ হয়।

সাবস্ক্রাইবার তৈরি করুন

আপনার প্রোজেক্টের জন্য নতুন সাবস্ক্রাইবার রেজিস্টার করতে, create এন্ডপয়েন্ট ব্যবহার করুন। আপনাকে এইসব তথ্য দিতে হবে:

  • project-id: প্রোজেক্ট নম্বর যেখানে ওয়েব হুক পরিষেবা অ্যাকাউন্ট তৈরি করা হয়েছে।
  • subscriberId: গ্রাহকের জন্য আপনার দেওয়া একটি অনন্য শনাক্তকারী। এই আইডি ৪ থেকে ৩৬টি অক্ষরের মধ্যে হতে হবে এবং রেগুলার এক্সপ্রেশনের ([a-z]([a-z0-9-]{2,34}[a-z0-9])) সাথে মিলতে হবে।
  • endpointUri: ওয়েবহুক বিজ্ঞপ্তির জন্য গন্তব্য URL।
  • subscriberConfigs: আপনি যে ধরনের ডেটার জন্য বিজ্ঞপ্তি পেতে চান, এবং প্রতিটির জন্য সাবস্ক্রিপশন নীতি।
  • endpointAuthorization: আপনার এন্ডপয়েন্টের জন্য অনুমোদনের মেকানিজম। এতে আপনার দেওয়া secret থাকতে হবে। secret-এর ভ্যালু প্রতিটি বিজ্ঞপ্তি মেসেজের সাথে Authorization হেডারে পাঠানো হয়। ইনকামিং অনুরোধ Google Health API থেকে এসেছে কিনা তা যাচাই করতে আপনি এই টোকেন ব্যবহার করতে পারবেন। যেমন, আপনি secret-কে Bearer R4nd0m5tr1ng123-এ সেট করতে পারেন, যা Bearer যাচাইকরণের জন্য, অথবা Basic dXNlcjpwYXNzd29yZA==-এ সেট করতে পারেন, যা সাধারণ যাচাইকরণের জন্য।

subscriberConfigs-এ আপনাকে প্রতিটি ডেটার ধরনের জন্য subscriptionCreatePolicy সেট করতে হবে। অটোমেটিক সাবস্ক্রিপশন ব্যবহার করতে এটি AUTOMATIC-এ সেট করুন অথবা আপনি নিজেই ব্যবহারকারীর সাবস্ক্রিপশন ম্যানেজ করতে চাইলে MANUAL-এ সেট করুন। প্রতিটি বিকল্প সম্পর্কে আরও জানতে অটোমেটিক সাবস্ক্রিপশন এবং ম্যানুয়াল সাবস্ক্রিপশন দেখুন।

অনুরোধ করুন

POST https://health.googleapis.com/v4/projects/project-id/subscribers?subscriberId=subscriber-id
{
  "endpointUri": "https://myapp.com/webhooks/health",
  "subscriberConfigs": [
    {
      "dataTypes": ["steps", "altitude", "distance", "floors", "weight"],
      "subscriptionCreatePolicy": "AUTOMATIC"
    },
    {
      "dataTypes": ["sleep"],
      "subscriptionCreatePolicy": "MANUAL"
    }
  ],
  "endpointAuthorization": {
    "secret": "Bearer example-secret-token"
  }
}

রেসপন্স

{
  "name": "projects/project-id/subscribers/subscriber-id",
  "endpointUri": "https://myapp.com/webhooks/health",
  "subscriberConfigs": [
    {
      "dataTypes": ["steps", "altitude", "distance", "floors", "weight"],
      "subscriptionCreatePolicy": "AUTOMATIC"
    },
    {
      "dataTypes": ["sleep"],
      "subscriptionCreatePolicy": "MANUAL"
    }
  ]
}

সাবস্ক্রাইবারদের তালিকা তৈরি করা হচ্ছে

আপনার প্রোজেক্টের জন্য রেজিস্টার করা সব সাবস্ক্রাইবারকে ফিরিয়ে আনতে list এন্ডপয়েন্ট ব্যবহার করুন।

অনুরোধ করুন

GET https://health.googleapis.com/v4/projects/project-id/subscribers

রেসপন্স

{
  "subscribers": [
    {
      "name": "projects/project-id/subscribers/subscriber-id",
      "endpointUri": "https://myapp.com/webhooks/health",
      "subscriberConfigs": [
        {
          "dataTypes": ["steps", "altitude", "distance", "floors", "weight"],
          "subscriptionCreatePolicy": "AUTOMATIC"
        },
        {
          "dataTypes": ["sleep"],
          "subscriptionCreatePolicy": "MANUAL"
        }
      ],
      "endpointAuthorization": {
        "authorizationTokenSet": true
      }
    }
  ],
  "totalSize": 1
}

সাবস্ক্রাইবার আপডেট করা

আপনার প্রোজেক্টে সাবস্ক্রাইবার আপডেট করতে patch এন্ডপয়েন্ট ব্যবহার করুন। যেসব ফিল্ড আপডেট করা যাবে সেগুলি হল endpointUri, subscriberConfigs এবং endpointAuthorization।

আপনি updateMask কোয়েরি প্যারামিটার ও অনুরোধের বডি প্রদান করে ফিল্ড আপডেট করেন। updateMask-এ অবশ্যই কমা দিয়ে আলাদা করা ফিল্ডের নামের তালিকা থাকতে হবে যা আপনি আপডেট করতে চান, ফিল্ডের নামের জন্য ক্যামেল কেস ব্যবহার করে (যেমন, endpointUri)। অনুরোধের বডিতে অবশ্যই আংশিক সাবস্ক্রাইবার অবজেক্ট থাকতে হবে, আপনি যে ফিল্ড আপডেট করতে চান তার নতুন মান সহ। updateMask-এ উল্লেখ করা ফিল্ডগুলিই শুধু আপডেট করা হয়। আপনি যদি অনুরোধের বডিতে এমন ফিল্ড প্রদান করেন যা updateMask-এ নেই, তাহলে সেগুলি উপেক্ষা করা হয়।

আপনি endpointUri বা endpointAuthorization আপডেট করলে, এন্ডপয়েন্ট যাচাইকরণ করা হয়। আরও বিবরণের জন্য এন্ডপয়েন্ট যাচাইকরণ দেখুন।

subscriberConfigs আপডেট করার সময় মনে রাখবেন যে এটি সম্পূর্ণভাবে পরিবর্তন করা হয়, মার্জ করা হয় না। updateMask-এ subscriberConfigs অন্তর্ভুক্ত থাকলে, সেই সাবস্ক্রাইবারের জন্য সব সেভ করা কনফিগারেশন অনুরোধের বডিতে দেওয়া তালিকা দিয়ে ওভাররাইট করা হয়। কোনও কনফিগারেশন যোগ করতে বা সরাতে, আপনাকে কনফিগারেশনের সম্পূর্ণ সেট প্রদান করতে হবে। আপনি যদি অন্যান্য ফিল্ড আপডেট করেন এবং আপনার বর্তমান কনফিগারেশন রাখতে চান, তাহলে updateMask থেকে subscriberConfigs বাদ দিন।

অনুরোধ করুন

PATCH https://health.googleapis.com/v4/projects/project-id/subscribers/subscriber-id?updateMask=endpointUri
{
  "endpointUri": "https://myapp.com/new-webhooks/health"
}

রেসপন্স

{
  "name": "projects/project-id/subscribers/subscriber-id",
  "endpointUri": "https://myapp.com/new-webhooks/health",
  "subscriberConfigs": [
    {
      "dataTypes": ["steps", "altitude", "distance", "floors", "weight"],
      "subscriptionCreatePolicy": "AUTOMATIC"
    },
    {
      "dataTypes": ["sleep"],
      "subscriptionCreatePolicy": "MANUAL"
    }
  ]
}

সাবস্ক্রাইবারকে মুছে দেওয়া

আপনার প্রোজেক্ট থেকে কোনও সাবস্ক্রাইবারকে সরাতে delete এন্ডপয়েন্ট ব্যবহার করুন। মুছে দেওয়া হলে, সাবস্ক্রাইবার আর বিজ্ঞপ্তি পাবেন না।

অনুরোধ করুন

DELETE https://health.googleapis.com/v4/projects/project-id/subscribers/subscriber-id

রেসপন্স

মুছে ফেলা সফল হলে, HTTP স্ট্যাটাস `200 OK` সহ একটি খালি রেসপন্স বডি ফেরত দেওয়া হয়।
{}

এন্ডপয়েন্ট যাচাইকরণ

আপনার বিজ্ঞপ্তি ডেলিভারির নিরাপত্তা ও নির্ভরযোগ্যতা নিশ্চিত করতে, আপনি যখনই কোনও সাবস্ক্রাইবার তৈরি করেন বা তার এন্ডপয়েন্ট কনফিগারেশন (endpointUri বা endpointAuthorization) আপডেট করেন, তখনই Google Health API একটি বাধ্যতামূলক দুই-ধাপে যাচাইকরণ হ্যান্ডশেক করে। API কল চলাকালীন এই প্রসেসটি সিঙ্ক্রোনাসভাবে করা হয়। পরিষেবাটি আপনার এন্ডপয়েন্ট URI-তে দুটি অটোমেটেড POST অনুরোধ পাঠায়, এক্ষেত্রে User-Agent Google-Health-API-Webhooks ব্যবহার করা হয়, সাথে JSON বডি {"type": "verification"} থাকে।

  • অনুমোদিত হ্যান্ডশেক: প্রথম অনুরোধটি আপনার কনফিগার করা Authorization হেডারের সাথে পাঠানো হয়। আপনার সার্ভারকে অবশ্যই 200 OK বা 201 Created স্ট্যাটাস সহ উত্তর দিতে হবে।
  • অননুমোদিত চ্যালেঞ্জ: ক্রেডেনশিয়াল ছাড়াই দ্বিতীয় অনুরোধ পাঠানো হয়েছে। আপনার সার্ভারকে অবশ্যই 401 Unauthorized বা 403 Forbidden স্ট্যাটাস সহ উত্তর দিতে হবে।

এই হ্যান্ডশেক কনফার্ম করে যে আপনার এন্ডপয়েন্ট অ্যাক্টিভ আছে এবং সঠিকভাবে নিরাপত্তা এনফোর্স করছে। কোনও একটি ধাপ সম্পূর্ণ না হলে, API অনুরোধ সম্পূর্ণ হয় না এবং FAILED_PRECONDITION সমস্যা দেখা যায়। এই হ্যান্ডশেক সফল হওয়ার পরেই আপনার সাবস্ক্রাইবার সেভ করা হয় এবং স্বাস্থ্য ডেটা বিজ্ঞপ্তি পাওয়ার জন্য অ্যাক্টিভেট করা হয়।

কী রোটেশন

endpointAuthorization-এর জন্য আপনাকে 'কী' রোটেট করতে হলে, এইসব ধাপ অনুসরণ করুন:

  1. পুরনো ও নতুন endpointAuthorization ভ্যালু গ্রহণ করার জন্য আপনার এন্ডপয়েন্ট কনফিগার করুন।
  2. ?updateMask=endpointAuthorization সহ patch অনুরোধ ব্যবহার করে নতুন endpointAuthorization ভ্যালু দিয়ে সাবস্ক্রাইবার কনফিগারেশন আপডেট করুন।
  3. ধাপ ২ সফলভাবে সম্পূর্ণ হয়েছে কিনা তা কনফার্ম করার পরে শুধুমাত্র নতুন endpointAuthorization ভ্যালু গ্রহণ করার জন্য আপনার এন্ডপয়েন্ট কনফিগার করুন।

ব্যবহারকারীর সাবস্ক্রিপশন

Google Health API আপনাকে ব্যবহারকারীর সাবস্ক্রিপশন দক্ষতার সাথে ম্যানেজ করতে সাহায্য করে, ব্যবহারকারী অনবোর্ডিংয়ের সময় ম্যানুয়াল রেজিস্ট্রেশনের প্রয়োজনীয়তা কমায়।

অটোমেটিক সাবস্ক্রিপশন

আমরা অটোমেটিক সাবস্ক্রিপশন ব্যবহার করার সাজেশন দিই। এই ফিচার চালু করতে, নির্দিষ্ট ডেটার ধরনের জন্য আপনার subscriberConfigs-এ subscriptionCreatePolicy-কে AUTOMATIC-এ সেট করুন। AUTOMATIC নীতির মাধ্যমে আপনি যে dataTypes উল্লেখ করেন, সেগুলি হল একই ধরনের ডেটা যার জন্য Google Health API বিজ্ঞপ্তি পাঠায়, তবে এইসব ডেটার ধরনের জন্য ব্যবহারকারীর সম্মতিও থাকতে হবে।

কোনও ব্যবহারকারী AUTOMATIC নীতি সহ ডেটার ধরন অনুযায়ী স্কোপের জন্য অ্যাপ্লিকেশন সংক্রান্ত সম্মতি দিলে, Google Health API অটোমেটিক ট্র্যাক করে এবং ব্যবহারকারীর সম্মতি দেওয়া ডেটার ধরন ও সেই ব্যবহারকারীর জন্য অটোমেটিক সাবস্ক্রাইবার কনফিগারেশন ডেটার ধরনের মধ্যে ইন্টারসেকশনের ফলে তৈরি হওয়া ডেটার ধরনের জন্য বিজ্ঞপ্তি পাঠায়। ব্যবহারকারী যখনই সেই ধরনের নতুন ডেটা তৈরি করেন, তখন আপনার এন্ডপয়েন্টে বিজ্ঞপ্তি পাঠানো হয়। এটি সেইসব ব্যবহারকারীর জন্য কাজ করে যারা আপনার সাবস্ক্রাইবার তৈরি করার আগে বা পরে সম্মতি দেন। সাবস্ক্রাইবার তৈরি করার আগে জেনারেট করা ডেটার জন্য বিজ্ঞপ্তি ব্যাকফিল করা হয় না।

ব্যবহারকারী সম্মতি প্রত্যাহার করলে, সংশ্লিষ্ট ডেটার ধরনের জন্য বিজ্ঞপ্তি পাঠানো বন্ধ হয়ে যাবে। অটোমেটিক সাবস্ক্রিপশন Google ম্যানেজ করে এবং আলাদাভাবে তালিকাভুক্ত বা মুছে ফেলা যায় না; মূল সাবস্ক্রাইবার মুছে ফেলা হলে তবেই এগুলি সরানো হয়।

ম্যানুয়াল সাবস্ক্রিপশন

আপনার সাবস্ক্রাইবার নির্দিষ্ট ডেটার ধরনের জন্য ম্যানুয়াল subscription_create_policy দিয়ে কনফিগার করা থাকলে, আপনাকে অবশ্যই প্রতিটি ব্যবহারকারীর জন্য সাবস্ক্রিপশন তৈরি ও ম্যানেজ করতে হবে। সাবস্ক্রিপশন, নির্দিষ্ট ডেটা টাইপের জন্য আপনার সাবস্ক্রাইবার এন্ডপয়েন্টের সাথে নির্দিষ্ট ব্যবহারকারীকে লিঙ্ক করে। ডেভেলপাররা নির্দিষ্ট API ব্যবহার করে এগুলি করতে পারেন:

  • healthUserId প্রতি (ম্যানুয়াল) সাবস্ক্রিপশন তৈরি করুন - নির্দিষ্ট ব্যবহারকারীর জন্য নতুন সাবস্ক্রিপশন তৈরি করে। এই পদ্ধতিতে সাবস্ক্রাইবারের অনুরোধ করা ডেটার ধরনের জন্য SubscriptionCreatePolicy-এর মান MANUAL-এ সেট করা থাকতে হবে।
  • সাবস্ক্রিপশন আপডেট (ম্যানুয়াল) - আগে থেকে থাকা ব্যবহারকারীর সাবস্ক্রিপশনের জন্য ডেটার ধরন আপডেট করে।
  • সাবস্ক্রিপশন (ম্যানুয়ালি) মুছে দিন - নির্দিষ্ট কোনও ব্যবহারকারীর সাবস্ক্রিপশন মুছে দেয়। মুছে দেওয়া হলে, আপনার সাবস্ক্রাইবার এন্ডপয়েন্ট সংশ্লিষ্ট ডেটার ধরনের জন্য এই ব্যবহারকারীর কোনও বিজ্ঞপ্তি আর পাবে না।
  • সাবস্ক্রিপশন (ম্যানুয়াল) তালিকাভুক্ত করুন - প্রদত্ত সাবস্ক্রাইবারের জন্য সব অ্যাক্টিভ সাবস্ক্রিপশন তালিকাভুক্ত করে। আপনি ব্যবহারকারী বা ডেটার ধরন অনুযায়ী ফলাফল ফিল্টার করতে পারবেন।

বিজ্ঞপ্তি পান

সাবস্ক্রাইব করা ডেটার ধরন অনুযায়ী কোনও ব্যবহারকারীর ডেটা পরিবর্তিত হলে, Google Health API সাবস্ক্রাইবার এন্ডপয়েন্ট URL-এ HTTPS POST অনুরোধ পাঠায়।

বিজ্ঞপ্তির ফর্ম্যাট

বিজ্ঞপ্তির পেলোডে ডেটা পরিবর্তনের বিবরণ থাকে, যার মধ্যে ব্যবহারকারীর আইডি, ডেটার ধরন এবং সময়সীমা অন্তর্ভুক্ত থাকে। আপনি এই তথ্য ব্যবহার করে আপডেট করা ডেটা সম্পর্কে কোয়েরি করতে পারেন। একাধিক আপডেট হলে বা আপডেট একত্রিত করা হলে, বিজ্ঞপ্তিগুলি একসাথে ব্যাচ করা হয় এবং বিজ্ঞপ্তি অবজেক্টের JSON অ্যারে হিসাবে ডেলিভার করা হয়।

ওয়েবহুক বিজ্ঞপ্তি ট্রিগার করা হলে, Google Health API আপনার সাবস্ক্রাইবার এন্ডপয়েন্টে নিম্নলিখিত ফর্ম্যাটে একটি HTTPS POST অনুরোধ পাঠায়:

আপসার্ট (টাইম-সিরিজ ডেটা)

POST https://your-endpoint-uri
Authorization: Bearer example-secret-token
GOOGLE-HEALTH-API-SIGNATURE: signature-value
Content-Type: application/json

{
  "data": {
    "version": "1",
    "clientProvidedSubscriptionName": "subscription-name",
    "healthUserId": "health-user-id",
    "operation": "UPSERT",
    "dataType": "steps",
    "intervals": [
      {
        "physicalTimeInterval": {
          "startTime": "2026-03-08T01:29:00Z",
          "endTime": "2026-03-08T01:34:00Z"
        },
        "civilDateTimeInterval": {
          "startDateTime": {
            "date": {
              "year": 2026,
              "month": 3,
              "day": 7
            },
            "time": {
              "hours": 17,
              "minutes": 29
            }
          },
          "endDateTime": {
            "date": {
              "year": 2026,
              "month": 3,
              "day": 7
            },
            "time": {
              "hours": 17,
              "minutes": 34
            }
          }
        },
        "civilIso8601TimeInterval": {
          "startTime": "2026-03-07T17:29:00",
          "endTime": "2026-03-07T17:34:00"
        }
      }
    ]
  }
}

মুছুন (টাইম-সিরিজ ডেটা)

POST https://your-endpoint-uri
Authorization: Bearer example-secret-token
GOOGLE-HEALTH-API-SIGNATURE: signature-value
Content-Type: application/json

[
  {
    "data": {
      "version": "1",
      "clientProvidedSubscriptionName": "subscription-name",
      "healthUserId": "health-user-id",
      "operation": "DELETE",
      "dataType": "steps",
      "intervals": [
        {
          "physicalTimeInterval": {
            "startTime": "2026-08-12T12:00:00Z",
            "endTime": "2026-08-12T12:30:00Z"
          },
          "civilIso8601TimeInterval": {
            "startTime": "2026-08-12T12:00:00",
            "endTime": "2026-08-12T12:30:00"
          }
        }
      ]
    }
  }
]

মুছে দিন (শনাক্তকরণযোগ্য ডেটা)

POST https://your-endpoint-uri
Authorization: Bearer example-secret-token
GOOGLE-HEALTH-API-SIGNATURE: signature-value
Content-Type: application/json

{
  "data": {
    "version": "1",
    "clientProvidedSubscriptionName": "subscription-name",
    "healthUserId": "health-user-id",
    "operation": "DELETE",
    "dataType": "sleep",
    "intervals": [
      {
        "physicalTimeInterval": {
          "startTime": "2026-08-12T22:00:00Z",
          "endTime": "2026-08-13T06:00:00Z"
        },
        "civilIso8601TimeInterval": {
          "startTime": "2026-08-12T22:00:00",
          "endTime": "2026-08-13T06:00:00"
        }
      }
    ],
    "recordId": "9875412"
  }
}

ব্যাচ (একাধিক ব্যবহারকারী ও ডেটার ধরন)

POST https://your-endpoint-uri
Authorization: Bearer example-secret-token
GOOGLE-HEALTH-API-SIGNATURE: signature-value
Content-Type: application/json

[
  {
    "data": {
      "version": "1",
      "clientProvidedSubscriptionName": "auto-project-number-subscriber-id-WEBHOOK_DATA_TYPE_STEPS",
      "healthUserId": "health-user-id-1",
      "operation": "UPSERT",
      "dataType": "steps",
      "intervals": [
        {
          "physicalTimeInterval": {
            "startTime": "2026-03-08T01:29:00Z",
            "endTime": "2026-03-08T01:34:00Z"
          },
          "civilDateTimeInterval": {
            "startDateTime": {
              "date": {
                "year": 2026,
                "month": 3,
                "day": 7
              },
              "time": {
                "hours": 17,
                "minutes": 29
              }
            },
            "endDateTime": {
              "date": {
                "year": 2026,
                "month": 3,
                "day": 7
              },
              "time": {
                "hours": 17,
                "minutes": 34
              }
            }
          },
          "civilIso8601TimeInterval": {
            "startTime": "2026-03-07T17:29:00",
            "endTime": "2026-03-07T17:34:00"
          }
        }
      ]
    }
  },
  {
    "data": {
      "version": "1",
      "clientProvidedSubscriptionName": "auto-project-number-subscriber-id-WEBHOOK_DATA_TYPE_WEIGHT",
      "healthUserId": "health-user-id-1",
      "operation": "UPSERT",
      "dataType": "weight",
      "intervals": [
        {
          "physicalTimeInterval": {
            "startTime": "2026-03-07T15:14:00Z",
            "endTime": "2026-03-07T15:16:00Z"
          },
          "civilDateTimeInterval": {
            "startDateTime": {
              "date": {
                "year": 2026,
                "month": 3,
                "day": 7
              },
              "time": {
                "hours": 7,
                "minutes": 14
              }
            },
            "endDateTime": {
              "date": {
                "year": 2026,
                "month": 3,
                "day": 7
              },
              "time": {
                "hours": 7,
                "minutes": 16
              }
            }
          },
          "civilIso8601TimeInterval": {
            "startTime": "2026-03-07T07:14:00",
            "endTime": "2026-03-07T07:16:00"
          }
        }
      ]
    }
  },
  {
    "data": {
      "version": "1",
      "clientProvidedSubscriptionName": "auto-project-number-subscriber-id-WEBHOOK_DATA_TYPE_STEPS",
      "healthUserId": "health-user-id-2",
      "operation": "UPSERT",
      "dataType": "steps",
      "intervals": [
        {
          "civilDateTimeInterval": {
            "startDateTime": {
              "date": {
                "year": 2026,
                "month": 8,
                "day": 20
              },
              "time": {
                "hours": 0,
                "minutes": 0
              }
            },
            "endDateTime": {
              "date": {
                "year": 2026,
                "month": 8,
                "day": 21
              },
              "time": {
                "hours": 0,
                "minutes": 0
              }
            }
          },
          "civilIso8601TimeInterval": {
            "startTime": "2026-08-20T00:00:00",
            "endTime": "2026-08-21T00:00:00"
          }
        }
      ]
    }
  },
  {
    "data": {
      "version": "1",
      "clientProvidedSubscriptionName": "subscription-name",
      "healthUserId": "health-user-id-2",
      "operation": "UPSERT",
      "dataType": "sleep",
      "intervals": [
        {
          "physicalTimeInterval": {
            "startTime": "2026-08-12T22:00:00Z",
            "endTime": "2026-08-13T06:00:00Z"
          },
          "civilDateTimeInterval": {
            "startDateTime": {
              "date": {
                "year": 2026,
                "month": 8,
                "day": 12
              },
              "time": {
                "hours": 22,
                "minutes": 0
              }
            },
            "endDateTime": {
              "date": {
                "year": 2026,
                "month": 8,
                "day": 13
              },
              "time": {
                "hours": 6,
                "minutes": 0
              }
            }
          },
          "civilIso8601TimeInterval": {
            "startTime": "2026-08-12T22:00:00",
            "endTime": "2026-08-13T06:00:00"
          }
        }
      ],
      "recordId": "9875412"
    }
  }
]

operation ফিল্ডটি পরিবর্তনের ধরন নির্দেশ করে যা বিজ্ঞপ্তিটি ট্রিগার করেছে:

  • UPSERT: কোনও ডেটা যোগ বা পরিবর্তন করার জন্য পাঠানো হয়েছে।
  • DELETE: ব্যবহারকারী স্পষ্টভাবে ডেটা মুছে দিলে পাঠানো হয় (যেমন, Fitbit অ্যাপ ব্যবহার করে dataPoints মুছে দেওয়া অথবা API ব্যবহার করে ব্যাচ মুছে দেওয়া)। সিস্টেম-লেভেল মুছে ফেলার ইভেন্টের জন্য ওয়েবহুক বিজ্ঞপ্তি পাঠানো হয় না, যেমন, কোনও ব্যবহারকারী অ্যাপ্লিকেশন অনুমতি প্রত্যাহার করলে বা তার Fitbit অ্যাকাউন্ট মুছে দিলে।

আমরা আপনার বিজ্ঞপ্তি ম্যানেজ করার লজিক আইডেমপোটেন্ট করার সাজেশন দিই, বিশেষ করে UPSERT অপারেশনের জন্য, কারণ আবার চেষ্টা করার ফলে ডুপ্লিকেট বিজ্ঞপ্তি পাঠানো হতে পারে।

clientProvidedSubscriptionName ফিল্ডটি হল একটি অনন্য শনাক্তকারী:

  • MANUAL নীতি সহ সাবস্ক্রিপশনের জন্য, এই ফিল্ডে সাবস্ক্রিপশন তৈরি করার সময় ডেভেলপারের দেওয়া সাবস্ক্রিপশনের নাম থাকে। এটি ম্যানুয়াল সাবস্ক্রিপশন ম্যানেজ করার জন্য একটি স্থায়ী আইডি প্রদান করে।
  • AUTOMATIC নীতি সহ তৈরি করা সাবস্ক্রিপশনের জন্য, Google Health API অটোমেটিক এই ফর্ম্যাটে একটি আইডেন্টিফায়ার তৈরি ও অ্যাসাইন করে: auto-<project-number>-<subscriber-id>-<WEBHOOK_DATA_TYPE_TOKEN>, যেখানে:
    • <project-number> হল ডেভেলপারের Google Cloud প্রোজেক্ট নম্বর (যেমন, 362978535920)।
    • <subscriber-id> হল সাবস্ক্রাইবারের রেজিস্ট্রেশন আইডি / সাবস্ক্রাইবারের নাম (যেমন, google-health-sync)।
    • <WEBHOOK_DATA_TYPE_TOKEN> হল নির্দিষ্ট ডেটার ধরন প্রতিনিধিত্বকারী টোকেন। সব সম্ভাব্য টোকেনের জন্য ওয়েবহুক ডেটা টাইপ টোকেনের শব্দভাণ্ডার দেখুন।

ম্যানুয়াল ও অটোমেটিক, উভয় নীতির জন্য clientProvidedSubscriptionName অন্তর্ভুক্ত করলে, সব ধরনের সাবস্ক্রিপশনের জন্য একই ধরনের বিজ্ঞপ্তি পেলোড ফর্ম্যাট নিশ্চিত করা যায়।

ব্যবহারকারীর আইডি ম্যাপিং

healthUserId হল সেই ব্যবহারকারীর জন্য Google Health API শনাক্তকারী যার ডেটা পরিবর্তন করা হয়েছে। আপনার অ্যাপ্লিকেশন একাধিক ব্যবহারকারীকে সাপোর্ট করলে, আপনার অ্যাপ্লিকেশনকে সম্মতি দিয়েছেন এমন যেকোনও ব্যবহারকারীর জন্য আপনি বিজ্ঞপ্তি পেতে পারেন। আপনি কোনও বিজ্ঞপ্তি পেলে, কোন ব্যবহারকারীর ডেটা পরিবর্তিত হয়েছে তা শনাক্ত করতে healthUserId ব্যবহার করুন, যাতে আপনি তার ডেটা কোয়েরি করার জন্য তার OAuth ক্রেডেনশিয়াল ব্যবহার করতে পারেন।

ব্যবহারকারীর OAuth ক্রেডেনশিয়াল তার healthUserId-এ ম্যাপ করতে, getIdentity এন্ডপয়েন্ট ব্যবহার করুন। ব্যবহারকারী অনবোর্ডিংয়ের সময় ব্যবহারকারীর ক্রেডেনশিয়াল দিয়ে এই এন্ডপয়েন্ট কল করুন যাতে তার healthUserId উদ্ধার করা যায় এবং এই ম্যাপিং স্টোর করুন। এই ম্যাপিং সময়ের সাথে সাথে পরিবর্তন হয় না, তাই এটি অনির্দিষ্টকালের জন্য ক্যাশে করা যেতে পারে। উদাহরণ হিসেবে, ব্যবহারকারীর আইডি পান দেখুন। এটি আপনাকে বিজ্ঞপ্তিতে healthUserId-এর উপর ভিত্তি করে ডেটা কোয়েরি করার সময় সঠিক ব্যবহারকারীর ক্রেডেনশিয়াল বেছে নিতে দেয়।

সময় বিরতি

intervals অ্যারেতে এক বা একাধিক অবজেক্ট থাকে যা পরিবর্তিত ডেটার জন্য সময়ের ব্যবধান দেখায়:

ফিল্ড ধরন প্রয়োজনীয় বিবরণ
physicalTimeInterval object না পরিবর্তিত ডেটার UTC ফিজিক্যাল টাইম ইন্টারভাল (YYYY-MM-DDTHH:MM:SSZ ফর্ম্যাট)। ইন্ট্রাডে মেট্রিকের জন্য পপুলেট করা হয়েছে; দৈনিক রোলআপ এবং সারাদিনের অ্যাক্টিভিটির জন্য বাদ দেওয়া হয়েছে।
civilDateTimeInterval object হ্যাঁ UTC বা টাইমজোন অফসেট ছাড়া, পরিবর্তিত ডেটার সিভিল (স্থানীয়) ক্যালেন্ডারের তারিখ এবং সময়ের ব্যবধান।
civilIso8601TimeInterval object হ্যাঁ UTC বা টাইমজোন অফসেট ছাড়া ISO 8601 স্ট্রিং (YYYY-MM-DDTHH:MM:SS ফর্ম্যাট) হিসেবে দেখানো সিভিল (স্থানীয়) সময়ের ব্যবধান।

সারাদিনের অ্যাক্টিভিটি এবং দৈনিক সমষ্টির জন্য, physicalTimeInterval ফিল্ডটি ইচ্ছাকৃতভাবে বিজ্ঞপ্তি পেলোড থেকে বাদ দেওয়া হয়েছে। কারণ, সারাদিনের ইভেন্টগুলি তাদের নামমাত্র সিভিল তারিখ অনুসারে বাকেট করা হয় এবং টাইমজোন অতিক্রম করার সময় ফিজিক্যাল সময়ের সময়কাল ভুল হতে পারে। পুরো দিনের ইভেন্ট প্রসেস করার সময়, পেশাদার পদ্ধতি হিসেবে আপনার civilDateTimeInterval বা civilIso8601TimeInterval ফিল্ডের উপর নির্ভর করা উচিত। সিভিল টাইম ফিল্টার ব্যবহার করে কীভাবে এইসব ডেটা পয়েন্ট কোয়েরি করবেন সেই সম্পর্কে বিস্তারিত জানতে, ইন্টারভ্যাল সিভিল শুরুর সময় অনুযায়ী ডেটা ফিল্টার করুন দেখুন।

নিচে সারাদিনের অ্যাক্টিভিটির জন্য বিজ্ঞপ্তি পেলোডের উদাহরণ দেওয়া হল যেখানে physicalTimeInterval ফিল্ডটি বাদ দেওয়া হয়েছে:

{
  "data": {
    "version": "1",
    "clientProvidedSubscriptionName": "auto-503461148219-lindasubscriber-WEBHOOK_DATA_TYPE_STEPS",
    "healthUserId": "343864966078399341",
    "operation": "UPSERT",
    "dataType": "steps",
    "intervals": [
      {
        "civilDateTimeInterval": {
          "startDateTime": {
            "date": {
              "year": 2026,
              "month": 7,
              "day": 14
            },
            "time": {}
          },
          "endDateTime": {
            "date": {
              "year": 2026,
              "month": 7,
              "day": 15
            },
            "time": {}
          }
        },
        "civilIso8601TimeInterval": {
          "startTime": "2026-07-14T00:00:00",
          "endTime": "2026-07-15T00:00:00"
        }
      }
    ]
  }
}

ওয়েবহুক ডেটা টাইপ টোকেনের শব্দভান্ডার

AUTOMATIC নীতি ব্যবহার করার সময়, জেনারেট করা clientProvidedSubscriptionName-এ ডেটার ধরনের উপর নির্ভর করে নিম্নলিখিত বড় হাতের অক্ষরে লেখা WEBHOOK_DATA_TYPE_* সাফিক্স টোকেনগুলির মধ্যে একটি থাকে:

ওয়েবহুক ডেটার ধরন টোকেন সংশ্লিষ্ট ডেটার ধরন
WEBHOOK_DATA_TYPE_ACTIVE_MINUTES active-minutes
WEBHOOK_DATA_TYPE_ACTIVE_ZONE_MINUTES active-zone-minutes
WEBHOOK_DATA_TYPE_ACTIVITY_LEVEL activity-level
WEBHOOK_DATA_TYPE_ALTITUDE altitude
WEBHOOK_DATA_TYPE_BLOOD_GLUCOSE blood-glucose
WEBHOOK_DATA_TYPE_BODY_FAT body-fat
WEBHOOK_DATA_TYPE_CALORIES_IN_HEART_RATE_ZONE calories-in-heart-rate-zone
WEBHOOK_DATA_TYPE_DAILY_HEART_RATE_VARIABILITY daily-heart-rate-variability
WEBHOOK_DATA_TYPE_DAILY_HEART_RATE_ZONES daily-heart-rate-zones
WEBHOOK_DATA_TYPE_DAILY_OXYGEN_SATURATION daily-oxygen-saturation
WEBHOOK_DATA_TYPE_DAILY_RESPIRATORY_RATE daily-respiratory-rate
WEBHOOK_DATA_TYPE_DAILY_RESTING_HEART_RATE daily-resting-heart-rate
WEBHOOK_DATA_TYPE_DAILY_SLEEP_TEMPERATURE_DERIVATIONS daily-sleep-temperature-derivations
WEBHOOK_DATA_TYPE_DISTANCE distance
WEBHOOK_DATA_TYPE_EXERCISE exercise
WEBHOOK_DATA_TYPE_FLOORS floors
WEBHOOK_DATA_TYPE_HEART_RATE heart-rate
WEBHOOK_DATA_TYPE_HEART_RATE_VARIABILITY heart-rate-variability
WEBHOOK_DATA_TYPE_HEIGHT height
WEBHOOK_DATA_TYPE_HYDRATION_LOG hydration-log
WEBHOOK_DATA_TYPE_NUTRITION_LOG nutrition-log
WEBHOOK_DATA_TYPE_RESPIRATORY_RATE_SLEEP_SUMMARY respiratory-rate-sleep-summary
WEBHOOK_DATA_TYPE_RUN_VO2_MAX run-vo2-max
WEBHOOK_DATA_TYPE_SEDENTARY_PERIOD sedentary-period
WEBHOOK_DATA_TYPE_SLEEP sleep
WEBHOOK_DATA_TYPE_STEPS steps
WEBHOOK_DATA_TYPE_TIME_IN_HEART_RATE_ZONE time-in-heart-rate-zone
WEBHOOK_DATA_TYPE_WEIGHT weight
WEBHOOK_DATA_TYPE_USER_DELETED user-deleted (সিস্টেম ইভেন্ট)
WEBHOOK_DATA_TYPE_USER_REVOKED_ACCESS user-revoked-access (সিস্টেম ইভেন্ট)

আপডেটের অ্যাগ্রিগেশন

নেটওয়ার্ক ট্রাফিক কমাতে, Google Health API মেসেজ ব্যাচ করে। সিস্টেমটি প্রতি ব্যাচে সর্বাধিক ৯৯টি মেসেজ পাঠানোর জন্য কনফিগার করা হয়েছে, যা উপলভ্য হওয়ার সাথে সাথে অটোমেটিক পুশ করা হয়।

মেসেজ ব্যাচ করা হলে, পেলোডটি একাধিক বিজ্ঞপ্তি অবজেক্ট সহ একটি JSON অ্যারে হিসাবে ডেলিভার করা হয়। একটি ব্যাচে একাধিক সাবস্ক্রাইব করা ডেটার ধরন জুড়ে একাধিক ব্যবহারকারীর জন্য আপডেট অন্তর্ভুক্ত থাকতে পারে। পে-লোডের উদাহরণ দেখতে, বিজ্ঞপ্তি ফর্ম্যাট বিভাগে ব্যাচ (একাধিক ব্যবহারকারী ও ডেটার ধরন) উদাহরণ দেখুন।

বিজ্ঞপ্তির উত্তর দিন

আপনার সার্ভারকে অবশ্যই Authorization হেডার যাচাই করতে হবে, সিঙ্ক্রোনাস এন্ডপয়েন্ট যাচাইকরণ হ্যান্ডশেক ম্যানেজ করতে হবে এবং HTTP 204 No Content স্ট্যাটাস কোড সহ ডেটা পরিবর্তনের বিজ্ঞপ্তির উত্তর অবিলম্বে দিতে হবে। টাইমআউট এড়াতে, উত্তর পাঠানোর পরে অ্যাসিঙ্ক্রোনাসভাবে বিজ্ঞপ্তি পেলোড প্রসেস করুন। Google Health API অন্য কোনও স্ট্যাটাস কোড পেলে বা অনুরোধের সময়সীমা শেষ হয়ে গেলে, এটি পরে বিজ্ঞপ্তি পাঠানোর জন্য আবার চেষ্টা করে।

Node.js (Express) উদাহরণ:

app.post('/webhook-receiver', (req, res) => {
    if (req.headers.authorization !== EXPECTED_SECRET) {
        return res.status(401).send();
    }
    if (req.body && !Array.isArray(req.body) && req.body.type === 'verification') {
        return res.status(200).send();
    }

    // 1. Immediately acknowledge the notification batch
    res.status(204).send();

    // 2. Normalize single-object or batched array notifications and reconcile asynchronously
    const notifications = Array.isArray(req.body) ? req.body : [req.body];
    setImmediate(async () => {
        for (const notification of notifications) {
            const { healthUserId, dataType, intervals = [] } = notification.data || {};
            console.log(`Update for user ${healthUserId} of type ${dataType}`);
            // Query /v4/users/${healthUserId}/dataTypes/${dataType}/dataPoints:reconcile?filter=...
            // for each interval in `intervals` (using >= and < comparators; for sleep, filter on
            // sleep.interval.end_time or sleep.interval.civil_end_time).
        }
    });
});

প্রতিটি বিজ্ঞাপিত ইন্টারভ্যালের জন্য আপডেট করা ডেটা পেতে, ইন্টারভ্যালের সময়সীমার জন্য ফিল্টার সহ reconcile এন্ডপয়েন্ট কল করুন। এটি কানেক্ট করা ডিভাইস থেকে ওভারল্যাপ করা ইন্টারভ্যাল অটোমেটিক ডিডুপ্লিকেট করে। বিস্তারিত বিবরণ এবং উদাহরণের জন্য, ইন্টারভাল ডেটার রিকনসাইল করা ভিউ পান দেখুন।

ডেটা পরিবর্তন সংক্রান্ত বিজ্ঞপ্তি পাওয়ার পরে আপনার ডেটাবেস আপডেট করার তিনটি সাধারণ স্ট্র্যাটেজি আছে:

  • কিউতে রাখা (সাজেস্ট করা): ইনকামিং বিজ্ঞপ্তিগুলি একটি মেসেজ কিউতে রাখুন এবং সিস্টেম রিসোর্সের উপর ভিত্তি করে কিউ থেকে সেগুলি প্রসেস করুন।
  • অবিলম্বে পুনরুদ্ধার: আপডেট করা ডেটা আনতে এবং আপনার ডেটাবেসে এটি কমিট করতে অবিলম্বে Google Health API কল করার জন্য আপনার ব্যাকএন্ডকে নির্দেশ দিন।
  • লেজি আপডেট: ব্যবহারকারীর লোকাল ডেটাবেস রেকর্ডকে ডার্টি হিসেবে চিহ্নিত করুন এবং ব্যবহারকারী পরের বার আপনার অ্যাপ্লিকেশন ভিজিট করলে তবেই Google Health API থেকে আপডেট করা ডেটা ফেচ করুন।

কিউয়িং স্ট্র্যাটেজি আপনাকে প্রায় রিয়েল-টাইমে ডেটা প্রসেস করতে দেয় এবং একসাথে অনেক বিজ্ঞপ্তি এলেও (যেমন, কোনও পরিষেবা বন্ধ হয়ে যাওয়ার কারণে বিজ্ঞপ্তি ব্যাকলগ হয়ে গেলে এবং পরে একসাথে সব বিজ্ঞপ্তি পাঠানো হলে) তা সামলাতে পারে। রিসোর্স বাঁচাতে আপনি দীর্ঘ-বিরতির ব্যাচ শিডিউলে (যেমন, প্রতি ৩ ঘণ্টা অন্তর) এইসব সারি প্রসেস করার বিকল্প বেছে নিতে পারলেও, এর অসুবিধা হল, ব্যবহারকারীরা সাধারণত প্রায় রিয়েল-টাইমে তাদের ডেটা আপডেট দেখতে চান।

পেশাদার পদ্ধতি

ডেটা আপডেট যাতে নির্ভরযোগ্য ও দক্ষভাবে ম্যানেজ করা যায় তা নিশ্চিত করতে এইসব পেশাদার পদ্ধতি অনুসরণ করুন:

  • Subscription API ব্যবহার করুন: পোলিং এন্ডপয়েন্টের পরিবর্তে, কোনও ব্যবহারকারীর কাছে ডাউনলোড করার জন্য নতুন ডেটা থাকলে বিজ্ঞপ্তি পেতে Subscription API ব্যবহার করুন।
  • আলাদাভাবে বিজ্ঞপ্তি সারিবদ্ধ ও প্রসেস করা: সাবস্ক্রিপশন বিজ্ঞপ্তি পাওয়ার সময়, সেগুলিকে সারিবদ্ধ করুন এবং আপনার সিস্টেমের রিসোর্সের উপর ভিত্তি করে আলাদাভাবে প্রসেস করুন। অনুরোধের সাথে সাথে স্বীকৃতি দিয়ে ওয়েব হুক এন্ডপয়েন্ট হালকা রাখুন।

স্বাক্ষর যাচাইকরণ

ওয়েবহুক বিজ্ঞপ্তির সত্যতা নিশ্চিত করতে, প্রতিটি আউটগোয়িং ওয়েবহুক বিজ্ঞপ্তির র JSON পেলোড Tink-এর PublicKeySign ব্যবহার করে ব্যক্তিগত কী দিয়ে সাইন করা হয়, অনুরোধে GOOGLE-HEALTH-API-SIGNATURE HTTP হেডারে Base64-এনকোড করা সিগনেচার প্রদান করে। এই সাইনিং কী প্রতি ৩০ দিন অন্তর অটোমেটিক রোটেট করা হয় এবং সংশ্লিষ্ট অফিসিয়াল পাবলিক কীসেট JSON ফাইল হিসেবে স্থায়ী URL https://www.gstatic.com/googlehealthapi/webhooks/webhooks_public_keyset.json-এ ডিস্ট্রিবিউট করা হয়।

কীভাবে স্বাক্ষর যাচাই করবেন

Tink ব্যবহার করে (প্রস্তাবিত): ডেভেলপাররা Tink-এর PublicKeyVerify প্রিমিটিভ ব্যবহার করে স্বাক্ষর যাচাই করতে পারেন। স্থায়ী URL থেকে পাবলিক কীসেট ফেচ করুন, কীসেটের সাহায্যে PublicKeyVerify প্রিমিটিভ ইনস্ট্যান্টিয়েট করুন এবং র ওয়েবহুক JSON পেলোডের সাথে ডিকোড করা GOOGLE-HEALTH-API-SIGNATURE হেডার যাচাই করুন।

ম্যানুয়ালি যাচাইকরণ (Tink ছাড়া): ডেভেলপার Tink ব্যবহার না করার সিদ্ধান্ত নিলে, তিনি এইসব ধাপ অনুসরণ করে ম্যানুয়ালি স্বাক্ষর যাচাই করতে পারবেন:

  1. Base64-ডিকোড GOOGLE-HEALTH-API-SIGNATURE হেডারকে আলাদা করে ৫-বাইট Tink প্রিফিক্স (যার মধ্যে ১-বাইট ভার্সন প্রিফিক্স এবং ৪-বাইট keyId থাকে) আসল DER-এনকোডেড স্বাক্ষর থেকে।
  2. https://www.gstatic.com/googlehealthapi/webhooks/webhooks_public_keyset.json থেকে JSON কীসেট ফেচ করুন।
  3. পার্স করা keyId-এর সাথে ম্যাচ করা 'কী' খুঁজে নিন এবং এর ভ্যালু ফিল্ড Base64-ডিকোড করুন, যার মধ্যে সিরিয়ালাইজ করা EcdsaPublicKey প্রোটোকল বাফার থাকে।
  4. এই বাইনারি পেলোড থেকে বিগ-এন্ডিয়ান x ও y কোঅর্ডিনেট (Protobuf ট্যাগ ৩ ও ৪) এক্সট্র্যাক্ট করুন।
  5. এক্সট্র্যাক্ট করা x ও y কোঅর্ডিনেট ব্যবহার করে বিল্ট-ইন ক্রিপ্টোগ্রাফি লাইব্রেরিতে স্ট্যান্ডার্ড ECDSA P-256 পাবলিক কী ইনস্ট্যান্টিয়েট করুন।
  6. SHA-256 অ্যালগরিদম ব্যবহার করে এক্সট্র্যাক্ট করা DER স্বাক্ষরের সাথে র ওয়েব হুক JSON পেলোড যাচাই করুন।

সাবস্ক্রাইবারের স্ট্যাটাস ও অ্যাকাউন্ট ফিরিয়ে আনা

আপনার সাবস্ক্রাইবার এন্ডপয়েন্ট উপলভ্য না থাকলে বা কোনও সমস্যার স্ট্যাটাস কোড (204 ছাড়া অন্য কিছু) দেখালে, Google Health API সর্বাধিক ৭ দিন পর্যন্ত বাকি থাকা বিজ্ঞপ্তি স্টোর করে এবং এক্সপোনেনশিয়াল ব্যাকঅফ সহ ডেলিভারি করার জন্য আবার চেষ্টা করে।

আপনার এন্ডপয়েন্ট আবার অনলাইন হয়ে গেলে এবং 204-এর সাথে উত্তর দিলে, API অটোমেটিক স্টোর করা মেসেজের ব্যাকলগ ডেলিভার করে। ৭ দিনের বেশি পুরনো বিজ্ঞপ্তি বাতিল করা হয় এবং তা ফিরিয়ে আনা যায় না।

যে ভুলগুলি প্রায়ই হয়ে থাকে

সমস্যার কোড মেসেজ বিবরণ সাজেশন
400 ত্রুটিযুক্ত অনুরোধ রিসোর্সের নামে ভুল প্রোজেক্ট নম্বর আছে অনুরোধের URL-এ প্রোজেক্ট নম্বরের পরিবর্তে আপনার Google Cloud প্রোজেক্ট আইডি ব্যবহার করে কোনও সাবস্ক্রাইবারকে মুছে ফেলা বা আপডেট করার সময়। এটি projects.subscribers এন্ডপয়েন্ট ব্যবহার করে ওয়েবহুক সাবস্ক্রিপশনের ক্ষেত্রে প্রযোজ্য। অনুরোধের URL-এ আপনার Google Cloud প্রোজেক্ট নম্বর ব্যবহার করুন, প্রোজেক্ট আইডি নয়।
403 নিষিদ্ধ কলারের অনুমতি নেই অনুরোধের URL-এ প্রোজেক্ট নম্বরের পরিবর্তে আপনার Google Cloud প্রোজেক্ট আইডি ব্যবহার করে সাবস্ক্রাইবার তৈরি বা তালিকাভুক্ত করার সময়। এটি projects.subscribers এন্ডপয়েন্ট ব্যবহার করে ওয়েবহুক সাবস্ক্রিপশনের ক্ষেত্রে প্রযোজ্য। অনুরোধের URL-এ আপনার Google Cloud প্রোজেক্ট নম্বর ব্যবহার করুন, প্রোজেক্ট আইডি নয়।