Node.js için SMS Doğrulama API'si
Bu sayfa, SMSBulk SMS doğrulama API'si için Node.js entegrasyon rehberi: script'iniz size özel bir telefon numarası satın alır, doğrulama SMS'ini bekler ve kodu JSON olarak okur. Node.js 18 ve üzeri için SDK da bağımlılık da gerekmez; yerleşik fetch yeterlidir. Aşağıdaki production seviyesi akış kopyala-yapıştır çalışır.
Kurulum: kurulacak bir şey yok
SMSBulk API'si için zorunlu bir npm paketi yok. API düz REST ve JSON olduğundan Node.js 18+ üzerindeki yerleşik fetch her şeyi karşılar. Panelden bir anahtar oluşturun, ortam değişkeni olarak dışa aktarın ve script'i çalıştırın. Zaten axios ya da başka bir HTTP istemcisi kullanıyorsanız her örnek bire bir çevrilir.
# Node.js 18 or newer ships fetch built in, so there is
# nothing to install for the flow below. Zero dependencies.
node --version
# Keep the API key out of your source code:
export SMSBULK_API_KEY=smsbulk_your_key_here
node verify.jsTek başlıkla kimlik doğrulama
Kimlik doğrulamalı her istek anahtarı X-API-Key başlığıyla gönderir. Anahtarı ortam değişkeninde veya secret yöneticinizde tutun, asla kaynak koda koymayın. Anahtarlar panelde oluşturulur, döndürülür ve iptal edilir; anahtarın açtığı tüm endpoint listesi API dokümantasyonu içindedir.
Node.js'te production seviyesi OTP akışı
Döngü, platformun etrafına kurulduğu üç çağrının aynısı: aktivasyon oluştur, kod gelene kadar sorgula, onayla. Bu sürüm gerçek bir servisin ihtiyacı gibi sertleştirildi: her istekte katı timeout, üstel backoff ile temkinli retry ve zaman aşımına uğrayan beklemenin otomatik iadeyle sonuçlanması için iptal yolu.
// verify.js (Node.js 18+, zero dependencies)
const BASE = 'https://smsbulk.net/api/v1';
const KEY = process.env.SMSBULK_API_KEY; // smsbulk_...
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
class SmsBulkError extends Error {
constructor(status, body) {
super('SMSBulk API ' + status + ': ' + body);
this.status = status;
}
}
// Retries are deliberately conservative: 429 (rate limit) is always safe to
// retry; network errors and 5xx are retried for GET and DELETE only. A
// failed POST is never retried blindly, so an ambiguous error can never
// buy two numbers.
async function api(path, { method = 'GET', body, timeoutMs = 15000, retries = 3 } = {}) {
const idempotent = method === 'GET' || method === 'DELETE';
for (let attempt = 0; ; attempt++) {
let res;
try {
res = await fetch(BASE + path, {
method,
headers: { 'X-API-Key': KEY, 'Content-Type': 'application/json' },
body: body ? JSON.stringify(body) : undefined,
signal: AbortSignal.timeout(timeoutMs), // hard per-request timeout
});
} catch (err) {
// Network failure or timeout.
if (idempotent && attempt < retries) {
await sleep(1000 * 2 ** attempt);
continue;
}
throw err;
}
if (res.ok) {
const text = await res.text();
return text ? JSON.parse(text) : null;
}
const errText = await res.text();
const retriable = res.status === 429 || (res.status >= 500 && idempotent);
if (retriable && attempt < retries) {
await sleep(1000 * 2 ** attempt);
continue;
}
throw new SmsBulkError(res.status, errText);
}
}
async function receiveOtp(serviceCode, countryIso, { pollMs = 5000, maxWaitMs = 600000 } = {}) {
// 1) Buy a dedicated number
const activation = await api('/activations', {
method: 'POST',
body: { serviceCode, countryIso },
});
console.log('Number:', activation.phoneNumber);
// 2) Poll until the verification code arrives
const deadline = Date.now() + maxWaitMs;
while (Date.now() < deadline) {
await sleep(pollMs);
const a = await api('/activations/' + activation.id);
if (a.status === 'RECEIVED') {
// 3) Confirm the code was used
await api('/activations/' + activation.id + '/complete', { method: 'POST' });
return a.smsCode;
}
if (['CANCELLED', 'EXPIRED', 'REFUNDED'].includes(a.status)) {
throw new Error('Ended without SMS: ' + a.status);
}
}
// 4) Give up: cancel so the charge returns to your balance automatically.
// Cancellation unlocks a couple of minutes after purchase, so keep
// maxWaitMs comfortably above that window.
await api('/activations/' + activation.id, { method: 'DELETE' });
throw new Error('No SMS within ' + maxWaitMs / 1000 + 's, activation cancelled and refunded');
}
receiveOtp('tg', 'US')
.then((code) => console.log('Verification code:', code))
.catch((err) => {
console.error(err.message);
process.exit(1);
});İstek imzaları, üretim API'sine karşı uçtan uca doğrulanan imzaların birebir aynısı. Akılda tutulacak iki ayrıntı: başarısız bir POST asla körlemesine tekrarlanmaz (belirsiz bir hata iki numara satın almamalı) ve iptal, satın almadan birkaç dakika sonra açılır; bekleme penceresini bunun üzerinde tutun. Tüm endpoint'ler ve yanıt alanları API dokümantasyonu içinde tanımlı.
Webhook değil, polling
v1 API polling tabanlıdır: status RECEIVED olana ve smsCode alanı dolana kadar aktivasyon durumunu sorgularsınız. Yapılandırılacak webhook yok; bu, dışarıya açılacak ve replay'e karşı korunacak bir şey de yok demektir. Beş saniyelik aralık iyi bir varsayılandır; kodların çoğu birkaç sorguda düşer.
Daha büyük bir Node.js servisinde polling döngüsünü HTTP request handler'ının içinde değil, kuyruk worker'ında veya arka plan işinde çalıştırın; aktivasyon id'sini saklayın ki yeniden başlayan worker yeni numara satın almak yerine aynı aktivasyona devam edebilsin.
Node.js'ten SMS göndermek ayrı bir üründür
"send and receive sms node js" aramalarının çoğu aslında iki farklı ihtiyaçtır. Rastgele telefon numaralarına mesaj göndermek bir SMS gateway ürünüdür ve bu API bunu yapmaz. Bu API alma tarafıdır: Node.js kodunuza gerçek, size özel bir numara verir ve o numaraya gelen doğrulama kodunu geri döndürür.
Alma tarafı; hesapları kişisel SIM'e bağlamadan kaydetmek, toplu kurumsal profil açılışlarını yürütmek veya kendi kayıt akışınızı gerçek numaralarla QA'den geçirmek için gereken şeydir. Son senaryo için SMS doğrulama testi rehberi CI açısını derinlemesine anlatır.
Popüler servisler için canlı başlangıç fiyatları
Fiyatlar başarılı doğrulama başınadır ve ülkeye göre değişir. Bu başlangıç fiyatları canlı katalogdan gelir ve bu sayfada saatlik yenilenir:
Kodunuz aynı veriyi okuyabilir: katalog endpoint'leri herkese açıktır ve doğrulayabileceğiniz her şey servis kataloğu sayfasında listelidir.
Node.js SMS API SSS
axios mu, yerleşik fetch mi kullanmalıyım?
Bu API için yerleşik fetch yeterli: başlıkları, JSON gövdeleri ve AbortSignal.timeout ile katı timeout'ları destekler; yukarıdaki akış sıfır bağımlılıkla çalışır. axios zaten yığınınızdaysa onu kullanın; retry mantığı için interceptor'lar doğal bir yerdir. Endpoint'ler ve başlıklar iki durumda da aynıdır.
Resmi bir npm paketi veya SDK var mı?
SDK gerekmez: API düz REST ve JSON'dır. Yukarıdaki akış bilinçli olarak bağımlılıksızdır. Klasik bir servis yerine AI ajanı kuruyorsanız, resmi MCP sunucusu dokümantasyonu aynı işlemleri yerel araçlar olarak sunar.
TypeScript ile çalışır mı?
Evet. Aktivasyon nesnesini bir kez tipleyin ({ id: string; status: string; phoneNumber: string; smsCode: string | null }) ve akışın tamamı strict modda tip kontrolünden geçer. Her endpoint'in yanıt şeması API dokümantasyonu içindedir.
ESM mi, CommonJS mi?
İkisi de. Yukarıdaki script yalnızca global'leri kullanır (fetch, process, setTimeout), hiç import içermez; bu yüzden .js CommonJS dosyası olarak da "type": "module" altında da değişmeden çalışır. Modül ayarınıza dokunmadan mevcut projeye ekleyin.
Çok sayıda doğrulamayı paralel çalıştırabilir miyim?
Evet, aktivasyonlar bağımsızdır; receiveOtp çağrıları üzerinde Promise.all çalışır. Ölçeklenirken belgelenmiş hız limitlerine uyun, aktivasyonları cursor sayfalamayla listeleyin ve maliyetleri cüzdan hareketlerinden aktivasyon bazında mutabık edin.
Kod hiç gelmezse ne olur?
Yukarıdaki akış bekleme penceresinden sonra aktivasyonu iptal eder ve tutar bakiyenize otomatik döner. Yalnızca kod teslim eden doğrulamalar için ödersiniz.
Keşfetmeye devam edin
Dilden bağımsız API'yi SMS doğrulama API'si sayfası derinlemesine anlatır; aynı akışın Python sürümü Python için SMS API adresinde. Hata kodlarından sayfalamaya geri kalan her şey API dokümantasyonu içinde.
