वेबबुक की सदस्यताएं

Google Health API की मदद से, आपका ऐप्लिकेशन, उपयोगकर्ता के स्वास्थ्य से जुड़े डेटा में बदलाव होने पर, रीयल-टाइम सूचनाएं पा सकता है. बदलावों के लिए पोल करने के बजाय, Google Health API में डेटा उपलब्ध होते ही, आपका सर्वर एचटीटीपीएस पोस्ट अनुरोध (वेबहुक) पाता है.

डेटा टाइप, जो इस्तेमाल किए जा सकते हैं

वेबहुक सूचनाएं, इन डेटा टाइप के लिए उपलब्ध हैं:

  • ऐक्टिव ज़ोन मिनट
  • ऊंचाई
  • बॉडी फ़ैट
  • धड़कन की दर वाले ज़ोन में खर्च की गई कैलोरी
  • रोज़ाना की धड़कन की दर में उतार-चढ़ाव
  • रोज़ाना की धड़कन की दर वाले ज़ोन
  • रोज़ाना ऑक्सीजन की मात्रा
  • रोज़ाना आराम करते समय धड़कन की दर
  • रोज़ाना नींद के दौरान तापमान में बदलाव
  • दूरी
  • कसरत
  • फ़्लोर
  • धड़कन की दर
  • नींद
  • कदम
  • खर्च की गई कुल कैलोरी
  • वज़न

इन डेटा टाइप के लिए सूचनाएं सिर्फ़ तब भेजी जाती हैं, जब किसी उपयोगकर्ता ने इनसे जुड़े किसी स्कोप के लिए सहमति दी हो:

  • ऐक्टिविटी, जिसमें कदम, ऊंचाई, दूरी, और फ़्लोर के डेटा टाइप शामिल हैं:
    • https://www.googleapis.com/auth/googlehealth.activity_and_fitness
    • https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
  • स्वास्थ्य से जुड़ी मेट्रिक, जिसमें वज़न का डेटा टाइप शामिल है:
    • https://www.googleapis.com/auth/googlehealth.health_metrics_and_measurements
    • https://www.googleapis.com/auth/googlehealth.health_metrics_and_measurements.readonly
  • नींद, जिसमें नींद का डेटा टाइप शामिल है:
    • https://www.googleapis.com/auth/googlehealth.sleep
    • https://www.googleapis.com/auth/googlehealth.sleep.readonly

सदस्यों को मैनेज करना

सूचनाएं पाने के लिए, आपको सदस्य के तौर पर रजिस्टर करना होगा. यह आपके ऐप्लिकेशन के सूचना एंडपॉइंट को दिखाता है. सदस्यों को मैनेज करने के लिए, REST API का इस्तेमाल किया जा सकता है. यह API projects.subscribers पर उपलब्ध है.

सदस्य के एंडपॉइंट के लिए, एचटीटीपीएस (TLSv1.2+) का इस्तेमाल करना ज़रूरी है. साथ ही, यह सार्वजनिक तौर पर ऐक्सेस किया जा सकता है. सदस्य बनाने और अपडेट करने के दौरान, Google Health API, पुष्टि करने की चुनौती देता है. इससे यह पक्का किया जाता है कि आपके पास एंडपॉइंट का यूआरआई है. अगर पुष्टि नहीं हो पाती है, तो सदस्य बनाने और अपडेट करने की कार्रवाइयां FailedPreconditionException के साथ पूरी नहीं हो पाती हैं.

सदस्य बनाना

अपने प्रोजेक्ट के लिए नया सदस्य रजिस्टर करने के लिए, create एंडपॉइंट का इस्तेमाल करें. आपको यह जानकारी देनी होगी:

  • project-id: वह प्रोजेक्ट नंबर जहां वेबहुक सेवा खाता बनाया गया था.
  • subscriberId: एक यूनीक आइडेंटिफ़ायर, जो सदस्य के लिए आपने दिया है. यह आईडी, 4 से 36 वर्णों के बीच होना चाहिए. साथ ही, यह रेगुलर एक्सप्रेशन ([a-z]([a-z0-9-]{2,34}[a-z0-9])) से मेल खाना चाहिए.
  • endpointUri: वेबहुक सूचनाओं के लिए डेस्टिनेशन यूआरएल.
  • subscriberConfigs: वे डेटा टाइप जिनके लिए आपको सूचनाएं चाहिए. साथ ही, हर डेटा टाइप के लिए सदस्यता की नीति.
  • endpointAuthorization: आपके एंडपॉइंट के लिए ऑथराइज़ेशन का तरीका. इसमें, आपके दिए गए secret की जानकारी होनी चाहिए. secret की वैल्यू, हर सूचना मैसेज के साथ Authorization हेडर में भेजी जाती है. इस टोकन का इस्तेमाल करके, यह पुष्टि की जा सकती है कि आने वाले अनुरोध, Google Health API से हैं. उदाहरण के लिए, Bearer ऑथेंटिकेशन के लिए secret को Bearer R4nd0m5tr1ng123 या बेसिक ऑथेंटिकेशन के लिए 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 को अपडेट करते समय, ध्यान दें कि यह पूरी तरह से बदलता है, न कि मर्ज होता है. अगर subscriberConfigs को updateMask में शामिल किया जाता है, तो उस सदस्य के लिए सेव किए गए सभी कॉन्फ़िगरेशन, अनुरोध के मुख्य हिस्से में दी गई सूची से बदल दिए जाते हैं. कोई कॉन्फ़िगरेशन जोड़ने या हटाने के लिए, आपको कॉन्फ़िगरेशन का पूरा सेट देना होगा. अगर आपको दूसरे फ़ील्ड अपडेट करने हैं और मौजूदा कॉन्फ़िगरेशन को बनाए रखना है, तो 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

जवाब

सदस्यता खत्म होने पर, एचटीटीपी स्टेटस `200 OK` के साथ खाली जवाब का मुख्य हिस्सा मिलता है.
{}

एंडपॉइंट की पुष्टि

सूचनाएं सुरक्षित और भरोसेमंद तरीके से डिलीवर हों, इसके लिए Google Health API, दो चरणों में पुष्टि करने की प्रोसेस पूरी करता है. यह प्रोसेस, सदस्य बनाते समय या उसके एंडपॉइंट कॉन्फ़िगरेशन (endpointUri या endpointAuthorization) को अपडेट करते समय पूरी की जाती है. यह प्रोसेस, एपीआई कॉल के दौरान सिंक्रोनस तरीके से पूरी की जाती है. सेवा, आपके एंडपॉइंट यूआरआई पर दो ऑटोमेटेड पोस्ट अनुरोध भेजती है. इसके लिए, User-Agent Google-Health-API-Webhooks-Verifier का इस्तेमाल किया जाता है. साथ ही, JSON के मुख्य हिस्से में {"type": "verification"} होता है.

  • ऑथराइज़्ड हैंडशेक: पहला अनुरोध, आपके कॉन्फ़िगर किए गए Authorization हेडर के साथ भेजा जाता है. आपके सर्वर को 200 OK या 201 Created स्टेटस के साथ जवाब देना होगा.
  • अनऑथराइज़्ड चैलेंज: दूसरा अनुरोध, क्रेडेंशियल के बिना भेजा जाता है. आपके सर्वर को 401 Unauthorized या 403 Forbidden स्टेटस के साथ जवाब देना होगा.

इस हैंडशेक से पुष्टि होती है कि आपका एंडपॉइंट चालू है और सुरक्षा को सही तरीके से लागू कर रहा है. अगर इनमें से कोई भी चरण पूरा नहीं होता है, तो एपीआई अनुरोध, FAILED_PRECONDITION गड़बड़ी के साथ पूरा नहीं होता है. इस हैंडशेक के पूरा होने के बाद ही, आपका सदस्य सेव किया जाता है और उसे स्वास्थ्य से जुड़े डेटा की सूचनाएं पाने के लिए चालू किया जाता है.

डेटा सुरक्षित करने वाली कुंजी का नया वर्शन बनाना

अगर आपको endpointAuthorization के लिए कुंजियां बदलनी हैं, तो यह तरीका अपनाएं:

  1. अपने एंडपॉइंट को पुराने और नए, दोनों endpointAuthorization वैल्यू स्वीकार करने के लिए कॉन्फ़िगर करें.
  2. सदस्य के कॉन्फ़िगरेशन को नई endpointAuthorization वैल्यू के साथ patch अनुरोध का इस्तेमाल करके, ?updateMask=endpointAuthorization के साथ अपडेट करें.
  3. दूसरे चरण के पूरा होने की पुष्टि करने के बाद, अपने एंडपॉइंट को सिर्फ़ नई endpointAuthorization वैल्यू स्वीकार करने के लिए कॉन्फ़िगर करें.

उपयोगकर्ता की सदस्यताएं

Google Health API की मदद से, उपयोगकर्ता की सदस्यताओं को आसानी से मैनेज किया जा सकता है. इससे, उपयोगकर्ता को शामिल करते समय, मैन्युअल तरीके से रजिस्टर करने की ज़रूरत कम हो जाती है.

अपने-आप सदस्यताएं

हमारा सुझाव है कि अपने-आप सदस्यताएं पाने की सुविधा का इस्तेमाल करें. इस सुविधा को चालू करने के लिए, खास डेटा टाइप के लिए अपने subscriberConfigs में subscriptionCreatePolicy को AUTOMATIC पर सेट करें. AUTOMATIC नीति के साथ बताए गए dataTypes, वही डेटा टाइप होते हैं जिनके लिए Google Health API सूचनाएं भेजता है. हालांकि, इसके लिए यह ज़रूरी है कि उपयोगकर्ता ने उन डेटा टाइप के लिए सहमति दी हो.

जब कोई उपयोगकर्ता, AUTOMATIC नीति वाले डेटा टाइप से जुड़े स्कोप के लिए ऐप्लिकेशन को सहमति देता है, तो Google Health API, उपयोगकर्ता की सहमति वाले डेटा टाइप और उस उपयोगकर्ता के लिए, अपने-आप सदस्य के कॉन्फ़िगरेशन वाले डेटा टाइप के बीच के डेटा टाइप को अपने-आप ट्रैक करता है और उनकी सूचनाएं भेजता है. इसके बाद, जब भी वह उपयोगकर्ता उन टाइप के लिए नया डेटा जनरेट करता है, तो आपके एंडपॉइंट पर सूचनाएं भेजी जाती हैं. यह सुविधा उन उपयोगकर्ताओं के लिए काम करती है जिन्होंने सदस्य बनाने से पहले या बाद में सहमति दी है. सदस्य बनाने से पहले जनरेट किए गए डेटा के लिए, सूचनाएं बैकफ़िल नहीं की जाती हैं.

अगर कोई उपयोगकर्ता सहमति वापस ले लेता है, तो उससे जुड़े डेटा टाइप के लिए सूचनाएं नहीं भेजी जाएंगी. अपने-आप सदस्यताएं, Google मैनेज करता है. इन्हें अलग-अलग सूची में शामिल या मिटाया नहीं जा सकता. इन्हें सिर्फ़ तब हटाया जाता है, जब मुख्य सदस्य को मिटाया जाता है.

मैन्युअल सदस्यताएं

अगर आपको हर उपयोगकर्ता के लिए सदस्यताओं को मैन्युअल तरीके से मैनेज करना है, तो subscriberConfigs में subscriptionCreatePolicy को MANUAL पर सेट करें. इस नीति के तहत, उपयोगकर्ता की सदस्यताएं अपने-आप नहीं बनती हैं. इस सुविधा का इस्तेमाल आने वाले समय में किया जाएगा, जब मैन्युअल सदस्यताओं को मैनेज करने के लिए एपीआई उपलब्ध कराए जाएंगे. जब तक ये एपीआई उपलब्ध नहीं होते, तब तक हमारा सुझाव है कि AUTOMATIC सदस्यताओं का इस्तेमाल करें.

सूचनाएं

जब किसी सदस्य के डेटा टाइप में बदलाव होता है, तो Google Health API, सदस्य के एंडपॉइंट यूआरएल पर एचटीटीपीएस पोस्ट अनुरोध भेजता है.

सूचना का फ़ॉर्मैट

सूचना का पेलोड, एक JSON ऑब्जेक्ट होता है. इसमें डेटा में हुए बदलाव के बारे में जानकारी होती है. इसमें उपयोगकर्ता का आईडी, डेटा टाइप, और समयावधि शामिल होती है. इसका इस्तेमाल, अपडेट किए गए डेटा के बारे में क्वेरी करने के लिए किया जा सकता है.

{
  "data": {
    "version": "1",
    "clientProvidedSubscriptionName": "subscription-name",
    "healthUserId": "health-user-id",
    "operation": "UPSERT",
    "dataType": "steps",
    "intervals": [
      {
        "physicalTimeInterval": {
          "startTime": "2026-03-0B01: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"
        }
      }
    ]
  }
}

operation फ़ील्ड, उस बदलाव के टाइप को दिखाता है जिसकी वजह से सूचना भेजी गई है:

  • UPSERT: डेटा जोड़ने या उसमें बदलाव करने पर भेजी जाती है.
  • DELETE: तब भेजी जाती है, जब कोई उपयोगकर्ता डेटा मिटाता है या जब सिस्टम इवेंट की वजह से डेटा हटाया जाता है. जैसे, उपयोगकर्ता अनुमति वापस लेता है या अपना खाता मिटाता है.

हमारा सुझाव है कि सूचना को मैनेज करने की लॉजिक को आइडमपोटेंट बनाएं. खास तौर पर, UPSERT कार्रवाइयों के लिए, क्योंकि दोबारा कोशिश करने पर डुप्लीकेट सूचनाएं भेजी जा सकती हैं.

clientProvidedSubscriptionName फ़ील्ड, एक यूनीक आइडेंटिफ़ायर है. MANUAL नीति वाली सदस्यताओं के लिए, इस फ़ील्ड में डेवलपर की ओर से दिया गया सदस्यता का वह नाम होता है जो सदस्यता बनाते समय बताया गया था. यह नाम हमेशा बना रहता है. इससे, मैन्युअल सदस्यताओं को मैनेज करने के लिए एक स्टेबल आईडी मिलता है. AUTOMATIC नीति के तहत बनाई गई सदस्यताओं के लिए, Google Health API, हर सूचना के लिए इस फ़ील्ड में एक यूनीक आइडेंटिफ़ायर (रैंडम यूयूआईडी) अपने-आप जनरेट करता है और असाइन करता है. मैन्युअल और अपने-आप सदस्यताएं, दोनों के लिए clientProvidedSubscriptionName को शामिल करने से, सभी तरह की सदस्यताओं के लिए सूचना के पेलोड का फ़ॉर्मैट एक जैसा रहता है.

healthUserId, उस उपयोगकर्ता के लिए Google Health API का आइडेंटिफ़ायर है जिसका डेटा बदला गया है. अगर आपका ऐप्लिकेशन एक से ज़्यादा उपयोगकर्ताओं के लिए काम करता है, तो आपको उस उपयोगकर्ता के लिए सूचनाएं मिल सकती हैं जिसने आपके ऐप्लिकेशन को सहमति दी है. सूचना मिलने पर, healthUserId का इस्तेमाल करके यह पता करें कि किस उपयोगकर्ता का डेटा बदला गया है. इससे, उसके OAuth क्रेडेंशियल का इस्तेमाल करके, उसके डेटा के बारे में क्वेरी की जा सकती है.

किसी उपयोगकर्ता के OAuth क्रेडेंशियल को उनके healthUserId से मैप करने के लिए, getIdentity एंडपॉइंट का इस्तेमाल करें. उपयोगकर्ता को शामिल करते समय, उसके क्रेडेंशियल के साथ इस एंडपॉइंट को कॉल करें, ताकि उसका healthUserId वापस पाया जा सके. इसके बाद, इस मैपिंग को सेव करें. यह मैपिंग समय के साथ नहीं बदलती है. इसलिए, इसे हमेशा के लिए कैश किया जा सकता है. उदाहरण के लिए, उपयोगकर्ता का आईडी पाना देखें. इससे, सूचना में मौजूद healthUserId के आधार पर डेटा के बारे में क्वेरी करते समय, उपयोगकर्ता के सही क्रेडेंशियल चुने जा सकते हैं.

किसी सूचना का जवाब देना

आपके सर्वर को सूचनाओं का जवाब तुरंत एचटीटीपी 204 No Content स्टेटस कोड के साथ देना होगा. टाइम आउट से बचने के लिए, जवाब भेजने के बाद, सूचना के पेलोड को एसिंक्रोनस तरीके से प्रोसेस करें. अगर Google Health API को कोई दूसरा स्टेटस कोड मिलता है या अनुरोध टाइम आउट हो जाता है, तो वह सूचना को बाद में दोबारा भेजने की कोशिश करता है.

Node.js (Express) का उदाहरण:

app.post('/webhook-receiver', (req, res) => {
    // 1. Immediately acknowledge the notification
    res.status(204).send();

    // 2. Process the data asynchronously in the background
    const notification = req.body;
    setImmediate(() => {
        console.log(`Update for user ${notification.data.healthUserId} of type ${notification.data.dataType}`);
        // Trigger your data retrieval logic here
    });
});

सदस्यता की स्थिति और उसे वापस पाना

अगर आपका सदस्य एंडपॉइंट उपलब्ध नहीं है या गड़बड़ी का स्टेटस कोड (204 के अलावा कोई भी कोड) दिखाता है, तो Google Health API, सात दिनों तक सूचनाओं को सेव रखता है. साथ ही, एक्सपोनेंशियल बैकऑफ़ के साथ उन्हें डिलीवर करने की कोशिश करता है.

जब आपका एंडपॉइंट फिर से ऑनलाइन हो जाता है और 204 के साथ जवाब देता है, तो एपीआई, सेव किए गए मैसेज के बैकलॉग को अपने-आप डिलीवर कर देता है. सात दिनों से ज़्यादा पुरानी सूचनाएं हटा दी जाती हैं और उन्हें वापस नहीं पाया जा सकता.