एनपीएम एसडीके — व्हाट्सएप-डेटा-एसडीके

WhatsApp डेटा API के लिए आधिकारिक TypeScript/JavaScript क्लाइंट। टाइप किए गए मेथड, शून्य रनटाइम निर्भरता, कैश-फर्स्ट लुकअप और एक स्पष्ट त्रुटि वर्गीकरण।

शून्य निर्भरताएँ
पूरी तरह से टाइप किया गया
ईएसएम + सीजेएस
npmGitHub

स्थापित करना

npm install whatsapp-data-sdk
# or
pnpm add whatsapp-data-sdk
# or
yarn add whatsapp-data-sdk

यह नेटिव फ़ेच फ़ंक्शन का उपयोग करता है — Node 18+, Bun, Deno और ब्राउज़र में काम करता है। इसमें axios या पॉलीफ़िल की आवश्यकता नहीं है।

त्वरित शुरुआत

import { WhatsAppDataClient } from 'whatsapp-data-sdk'

const client = new WhatsAppDataClient({
  apiKey: process.env.WA_API_KEY!, // sent as x-rapidapi-key
})

const profile = await client.getProfile('59898297150')
console.log(profile.exists, profile.about, profile.profilePic)

प्रमाणीकरण एवं परिवहन

आपकी API कुंजी हमेशा x-rapidapi-key हेडर में भेजी जाती है। ट्रांसपोर्ट के साथ चुनें कि अनुरोध कहाँ भेजे जाएँगे।

transportलाइव होस्टकैश / डेटाबेस-ओनली होस्टनोट्स
'proxy' (गलती करना)whatsapp-proxy.checkleaked.cc/number_cache एक ही होस्ट परसरल - एक बेस यूआरएल, कोई होस्ट हेडर नहीं।
'rapidapi'wp-data.p.rapidapi.comwp-data-db-only.p.rapidapi.comx-rapidapi-host स्वचालित रूप से सेट हो जाता है। अपनी RapidAPI कुंजी का उपयोग करें।
// RapidAPI marketplace (live + DB-only hosts)
const client = new WhatsAppDataClient({
  apiKey: process.env.RAPIDAPI_KEY!,
  transport: 'rapidapi',
})

आप baseUrl, cacheBaseUrl, rapidApiHost, rapidApiCacheHost के माध्यम से किसी भी URL/होस्ट को ओवरराइड कर सकते हैं।

कैश-फर्स्ट लुकअप (पैसे बचाएं)

checkCached() पहले सस्ते कैश/डीबी-ओनली एंडपॉइंट को पढ़ता है और जब संख्या अभी तक कैश में नहीं होती है, तभी यह पेड लाइव चेक पर वापस जाता है।

// cacheFirst (default): DB first → live only on a miss
const r1 = await client.checkCached('59898297150')
console.log(r1._source) // 'cache' | 'live'

// cacheOnly: never spend on a live check
const r2 = await client.checkCached('59898297150', { mode: 'cacheOnly' })

// live: always fresh
const r3 = await client.checkCached('59898297150', { mode: 'live' })

rapidapi ट्रांसपोर्ट पर यह कैश रीड को wp-data-db-only.p.rapidapi.com पर और लाइव फॉलबैक को wp-data.p.rapidapi.com पर रूट करता है - दो-होस्ट वाला यह प्रवाह पैसे बचाने में सहायक है।

एपीआई संदर्भ

प्रत्येक विधि सीधे मार्केटप्लेस एंडपॉइंट से मैप होती है।

प्रोफ़ाइल चित्र

await client.getProfile(number, options?)            // Get Profile Information
await client.getProfileNoPicture(number, options?)   // Get Profile Information (No profile pic)
await client.getLastPicture(number)                  // Get Last Saved Picture (JPEG bytes)
await client.getDeviceCount(number)                  // Device count
await client.getOsintInfo(number)                    // OSINT Info

getProfile विकल्पों में टेलीग्राम, गूगल, लुकअप, includeCarrier, base64, geminiFaceAnalysis, reverseImageSearch, fullAiReport, includeDeviceCount, onlyCheck, useCache, forceBypassCache, और भी बहुत कुछ शामिल हैं।

const pic = await client.getLastPicture('59898297150')
// pic.bytes: Uint8Array, pic.contentType: string
htmlImg.src = pic.toDataUri()

फ़ोन उल्लंघन

await client.getPhoneBreaches(number, { limit, offset }) // Get Phone Breaches (no external key)
await client.getPhoneBreachesExternal(number, apiKey)     // Get Phone Breaches (your checkleaked.cc key)

खोज और डेटाबेस

await client.search({ countryCode: 'UY', isBusiness: true, limit: 20 })   // Search
await client.searchGoogleMaps({ latitude: -34.9, longitude: -56.16, radius: 2000 }) // Search in Google Maps

// Bulk downloads return a Google Drive link to the full dataset (MEGA tier only)
const leaks = await client.getLeakedNumbersInfo()   // Leaked Numbers (500M database)
console.log(leaks.driveFolder.url)

const backup = await client.downloadEntireDatabase() // Download the Entire DB
console.log(backup.driveFolder.url)

बल्क चेक

await client.bulkCheck(numbers, { includeBusiness, noBanStatus }) // Bulk Check (live, max 50)
await client.bulkCheckDbBasic(numbers)                            // Basic Check (DB, max 1000)
await client.bulkCheckDbFull(numbers)                            // Full Check (DB, max 1000)

टेलीग्राम और कैरियर

// Telegram (experimental)
await client.getTelegramProfile('59898297150')            // single
await client.getTelegramProfile(['num1', 'num2'])         // batch

// Carrier
await client.carrierLookup(number)              // Carrier Lookup
await client.carrierLookupAlt(number)           // Carrier Lookup Alternative (spam-report signals)
await client.carrierLookupAlt(number, { page: 2 }) // page through the reports (response has a `pagination` block)

"नहीं मिला" का समाधान हो जाता है — इससे कोई त्रुटि नहीं आती।

किसी नंबर का व्हाट्सएप पर न होना एक सामान्य परिणाम है, त्रुटि नहीं, इसलिए ये समस्याएं हल हो जाती हैं (वे कभी अस्वीकार नहीं होतीं):

getProfile / getProfileNoPicture / checkCached एक प्रविष्टि लौटाता है जिसमें exists:false (और code:'NUMBER_NOT_FOUND') होता है।
शून्य मिलान के साथ खोज एक खाली पृष्ठ लौटाती है (सफलता: गलत, data.docs:[])।
किसी गैर-व्हाट्सएप नंबर के लिए getDeviceCount कमांड सफलता: गलत (deviceCount अनुपस्थित होने पर) लौटाता है।
const p = await client.getProfile('14155552671')
if (!p.exists) console.log('not on WhatsApp')

यह क्या त्रुटि उत्पन्न करता है: एक अमान्य संख्या (400), प्रमाणीकरण विफलता (401/403), दर सीमा (429), टाइमआउट, नेटवर्क विफलता और 5xx।

त्रुटियाँ

सभी अस्वीकरण WhatsAppDataError का एक उपवर्ग हैं, इसलिए एक ही कैच कोड सब कुछ संभाल लेता है।

कक्षाकब
ValidationErrorगलत तर्क (किसी भी अनुरोध से पहले, समकालिक रूप से फेंके गए; कोई .status नहीं)।
AuthError401 / 403 — कुंजी गुम, अमान्य या अनसब्सक्राइब की गई है।
RateLimitError429 — सर्वर द्वारा Retry-After भेजे जाने पर retryAfterMs ले जाता है।
HttpErrorकोई अन्य गैर-2xx (जैसे 400, 5xx); .status और .body रखता है।
TimeoutErrorअनुरोध का समय सीमा से अधिक हो गया।
NetworkErrorपरिवहन विफलता (डीएनएस, कनेक्शन रीसेट, मध्य-अवरोध)।
WhatsAppDataErrorउपरोक्त सभी के लिए आधार वर्ग।
import { AuthError, RateLimitError, TimeoutError, WhatsAppDataError } from 'whatsapp-data-sdk'

try {
  await client.getProfile('59898297150')
} catch (err) {
  if (err instanceof AuthError) {/* 401/403 — bad/unsubscribed key */}
  else if (err instanceof RateLimitError) {/* 429 — err.retryAfterMs */}
  else if (err instanceof TimeoutError) {/* request timed out */}
  else if (err instanceof WhatsAppDataError) {
    console.error(err.status, err.body)
  }
}

विन्यास

new WhatsAppDataClient({
  apiKey: '...',           // required
  transport: 'proxy',      // 'proxy' | 'rapidapi'
  timeoutMs: 60000,        // request timeout (bounds headers AND body read)
  retries: 2,              // retry 5xx / 429 / network / timeout (GET only) with backoff
  retryDelayMs: 500,       // exponential base; 429 honors Retry-After when longer
  baseUrl: '...',          // override live base URL
  cacheBaseUrl: '...',     // override cache/DB-only base URL
  rapidApiHost: '...',     // override live x-rapidapi-host
  rapidApiCacheHost: '...',// override cache x-rapidapi-host
  userAgent: '...',        // custom User-Agent
  fetch: globalThis.fetch, // inject a custom fetch (tests / polyfills)
})

फ़ोन नंबर प्रारूप

संख्याओं को किसी भी प्रारूप में पास करें — SDK उन्हें सामान्यीकृत करता है, और सहायक टूल निर्यात करता है ताकि आप उसी सामान्यीकरण का पुन: उपयोग कर सकें:

import { toDigits, toE164 } from 'whatsapp-data-sdk'
toDigits('+598 98 297 150') // '59898297150'  (path & live endpoints)
toE164('59898297150')       // '+59898297150' (bulk-DB endpoints; their validator requires it)
// both throw ValidationError on input with no digits

अनुरोध-आधारित विकल्प

प्रत्येक विधि एक ट्रेलिंग विकल्प ऑब्जेक्ट लेती है जो सिग्नल, टाइमआउटएमएस और रिट्राई को भी स्वीकार करती है - प्रति-कॉल रद्दीकरण और ट्यूनिंग के लिए:

const controller = new AbortController()
const p = client.getProfile('59898297150', {
  telegram: true,
  signal: controller.signal, // cancel this specific request
  timeoutMs: 5000,           // override the client timeout for this call
})
controller.abort() // rejects with WhatsAppDataError

संबंधित

हमारे उपयोगकर्ता क्या कहते हैं

हमारे संतुष्ट ग्राहकों की वास्तविक समीक्षाएं

4.5/5 (176 समीक्षाएं)