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


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

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

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

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

सदस्यता लेने वाला व्यक्ति बनाना

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

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

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": {
    "authorization_token": "Bearer example-secret-token"
  }
}

जवाब

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

सदस्यों की सूची

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",
      "state": "ACTIVE",
      "subscriberConfigs": [
        {
          "dataTypes": ["steps", "altitude", "distance", "floors", "weight"],
          "subscriptionCreatePolicy": "AUTOMATIC"
        },
        {
          "dataTypes": ["sleep"],
          "subscriptionCreatePolicy": "MANUAL"
        }
      ],
      "endpointAuthorization": {
        "authorizationTokenSet": true
      }
    }
  ],
  "nextPageToken": ""
}

किसी सदस्य की जानकारी अपडेट करना

अपने प्रोजेक्ट में किसी सदस्य की जानकारी अपडेट करने के लिए, patch एंडपॉइंट का इस्तेमाल करें. इन फ़ील्ड को अपडेट किया जा सकता है: endpointUri, subscriberConfigs, और endpointAuthorization.

updateMask क्वेरी पैरामीटर और अनुरोध का मुख्य हिस्सा देकर, फ़ील्ड अपडेट किए जाते हैं. updateMask में, कॉमा लगाकर अलग किए गए फ़ील्ड के नामों की सूची होनी चाहिए. इसमें उन फ़ील्ड के नाम होने चाहिए जिन्हें आपको अपडेट करना है. फ़ील्ड के नामों के लिए, कैमल केस का इस्तेमाल करें (उदाहरण के लिए, endpointUri). अनुरोध के मुख्य हिस्से में, Subscriber ऑब्जेक्ट का कुछ हिस्सा होना चाहिए. इसमें उन फ़ील्ड के लिए नई वैल्यू होनी चाहिए जिन्हें आपको अपडेट करना है. सिर्फ़ 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",
  "state": "ACTIVE",
  "subscriberConfigs": [
    {
      "dataTypes": ["steps", "altitude", "distance", "floors", "weight"],
      "subscriptionCreatePolicy": "AUTOMATIC"
    },
    {
      "dataTypes": ["sleep"],
      "subscriptionCreatePolicy": "MANUAL"
    }
  ],
  "endpointAuthorization": {
    "authorizationTokenSet": true
  }
}

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

सूचनाएं सुरक्षित तरीके से और भरोसेमंद तरीके से डिलीवर हों, इसके लिए Google Health API, दो चरणों में पुष्टि करने की प्रोसेस को पूरा करता है. यह प्रोसेस तब पूरी की जाती है, जब कोई सदस्य बनाया जाता है या उसके एंडपॉइंट कॉन्फ़िगरेशन (endpointUri या endpointAuthorization) को अपडेट किया जाता है. यह प्रोसेस, एपीआई कॉल के दौरान एक साथ पूरी की जाती है. यह सेवा, आपके एंडपॉइंट यूआरआई को दो अपने-आप भेजे जाने वाले POST अनुरोध भेजती है. इसके लिए, 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. ?updateMask=endpointAuthorization के साथ patch अनुरोध का इस्तेमाल करके, नई endpointAuthorization वैल्यू के साथ सदस्य के कॉन्फ़िगरेशन को अपडेट करें.
  3. अपने एंडपॉइंट को कॉन्फ़िगर करें, ताकि वह सिर्फ़ नई endpointAuthorization वैल्यू स्वीकार करे. इसके लिए, यह पुष्टि करना ज़रूरी है कि दूसरा चरण पूरा हो गया है.

किसी सदस्य को मिटाना

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

अनुरोध

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

जवाब

अगर मिटाने की प्रोसेस पूरी हो जाती है, तो एचटीटीपी स्टेटस `200 OK` के साथ खाली रिस्पॉन्स बॉडी मिलती है.
{}

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

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

अपने-आप रिन्यू होने वाली सदस्यताएं

हमारा सुझाव है कि ऑटोमैटिक सदस्यताएं इस्तेमाल करें. इस सुविधा को चालू करने के लिए, subscriberConfigs में जाकर, खास डेटा टाइप के लिए subscriptionCreatePolicy को AUTOMATIC पर सेट करें. dataTypes नीति के तहत बताए गए AUTOMATIC, उसी तरह के डेटा टाइप होते हैं जिनके लिए 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 के साथ जवाब देने पर, एपीआई स्टोर किए गए मैसेज का बैकलॉग अपने-आप डिलीवर कर देता है. सात दिन से ज़्यादा पुरानी सूचनाएं हटा दी जाती हैं और उन्हें वापस नहीं लाया जा सकता.