SDK npm — whatsapp-data-sdk

Klien TypeScript/JavaScript resmi untuk WhatsApp Data API. Metode bertipe, tanpa dependensi runtime, pencarian berbasis cache, dan taksonomi kesalahan yang bersih.

Tidak ada ketergantungan sama sekali
Diketik sepenuhnya
ESM + CJS
npmGitHub

Memasang

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

Menggunakan fungsi fetch bawaan — berfungsi di Node 18+, Bun, Deno, dan browser. Tidak memerlukan axios, tidak memerlukan polyfill.

Mulai cepat

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)

Otentikasi & transportasi

Kunci API Anda selalu dikirimkan dalam header x-rapidapi-key. Pilih ke mana permintaan akan dikirim dengan transport.

transportPembawa acara langsungHost khusus cache/basis dataCatatan
'proxy' (bawaan)whatsapp-proxy.checkleaked.cc/number_cache pada host yang samaSederhana — satu URL dasar, tanpa header host.
'rapidapi'wp-data.p.rapidapi.comwp-data-db-only.p.rapidapi.comMengatur x-rapidapi-host secara otomatis. Gunakan kunci RapidAPI Anda.
// RapidAPI marketplace (live + DB-only hosts)
const client = new WhatsAppDataClient({
  apiKey: process.env.RAPIDAPI_KEY!,
  transport: 'rapidapi',
})

Anda dapat mengganti URL/host apa pun melalui baseUrl, cacheBaseUrl, rapidApiHost, rapidApiCacheHost.

Pencarian berbasis cache (menghemat biaya)

Fungsi checkCached() membaca endpoint cache murah/khusus basis data terlebih dahulu dan hanya beralih ke pengecekan langsung berbayar jika angka tersebut belum tersimpan dalam cache.

// 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' })

Pada transport rapidapi, ini mengarahkan pembacaan cache ke wp-data-db-only.p.rapidapi.com dan fallback langsung ke wp-data.p.rapidapi.com — alur hemat biaya dua host.

Referensi API

Setiap metode dipetakan 1:1 ke titik akhir pasar.

Profil & foto

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

Opsi getProfile meliputi telegram, google, lookup, includeCarrier, base64, geminiFaceAnalysis, reverseImageSearch, fullAiReport, includeDeviceCount, onlyCheck, useCache, forceBypassCache, dan banyak lagi.

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

Pelanggaran keamanan telepon

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

Pencarian & basis data

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)

Cek massal

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 & operator

// 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)

"Tidak ditemukan" akan teratasi — tidak akan menimbulkan kesalahan.

Nomor yang tidak terdaftar di WhatsApp adalah hal yang wajar, bukan kesalahan, jadi hal ini akan teratasi (tidak pernah ditolak):

getProfile / getProfileNoPicture / checkCached mengembalikan entri dengan exists:false (dan kode:'NUMBER_NOT_FOUND').
Pencarian dengan hasil nol mengembalikan halaman kosong (success:false, data.docs:[]).
getDeviceCount untuk nomor non-WhatsApp mengembalikan success:false (jika deviceCount tidak ada).
const p = await client.getProfile('14155552671')
if (!p.exists) console.log('not on WhatsApp')

Apa saja yang akan dilemparkan: nomor tidak valid (400), kegagalan otentikasi (401/403), batas laju (429), waktu habis, kegagalan jaringan, dan 5xx.

Kesalahan

Semua penolakan merupakan subkelas dari WhatsAppDataError, jadi satu blok penanganan (catch) akan menangani semuanya.

KelasKapan
ValidationErrorArgumen yang buruk (dilemparkan secara sinkron, sebelum permintaan apa pun; tanpa .status).
AuthError401 / 403 — kunci hilang, tidak valid, atau tidak berlangganan.
RateLimitError429 — membawa retryAfterMs ketika server mengirimkan Retry-After.
HttpErrorSelain tipe data 2xx (misalnya 400, 5xx); terdapat ekstensi .status dan .body.
TimeoutErrorPermintaan tersebut melebihi batas waktu yang ditentukan.
NetworkErrorKegagalan pengiriman (DNS, koneksi terputus, pembatalan di tengah proses).
WhatsAppDataErrorKelas dasar untuk semua hal di atas.
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)
  }
}

Konfigurasi

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)
})

Format nomor telepon

Berikan angka dalam format apa pun — SDK akan menormalkannya, dan mengekspor fungsi-fungsi pembantu sehingga Anda dapat menggunakan kembali normalisasi yang sama:

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

Opsi berdasarkan permintaan

Setiap metode menerima objek opsi tambahan yang juga menerima sinyal, timeoutMs, dan percobaan ulang — untuk pembatalan dan penyesuaian per panggilan:

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

Terkait

Apa Kata Pengguna Kami

Ulasan nyata dari pelanggan kami yang puas

4.5/5 (176 ulasan)