E-posta Kontrolü API Referansı
POST/v1/email/validate
Tek bir e-posta adresini kontrol eder: sözdizimi, bilinen tek kullanımlık/geçici alan adları, alan adının posta sunucusu (MX), olası yazım hataları ve rol adresleri; ardından gerekçeleriyle birlikte accept/review/reject kararı döndürür. { "email": "user@example.com" } biçiminde bir JSON gövdesi gönderin. GET /v1/geo ile aynı yayınlanabilir, origin'e kilitli anahtar modelini kullanarak bir kayıt formunun kendi JavaScript'inden çağrılmak üzere tasarlanmıştır. Çok sayıda adres veya sunucu tarafında bir kayıt kararı için bu sayfanın aşağısındaki toplu, liste işi ve kayıt kontrolü uç noktalarını kullanın. Tüm kontroller alan adı ve adres düzeyindedir: hiçbir posta kutusuyla iletişim kurulmaz, dolayısıyla hiçbir sonuç bir posta kutusunun var olduğunu, kime ait olduğunu veya postanın oraya ulaşacağını kanıtlamaz.
Kimlik doğrulama
POST /v1/email/validate, X-Api-Key başlığı üzerinden origin'e kilitli yayınlanabilir bir anahtar kabul eder — GET /v1/geo ile aynı anahtar türü ve izin verilen origin modeli. Bu sayfadaki diğer tüm uç noktalar (toplu, liste işleri, kayıt kontrolü) çok sayıda adres veya rastgele bir IP kabul ettiğinden, Authorization: Bearer üzerinden gizli anahtarınızı gerektirir ve yalnızca arka ucunuzdan çağrılmalıdır; yayınlanabilir bir anahtar orada 403 alır.
Yanıt alanları
- Gönderdiğiniz adres, tam olarak gönderildiği şekliyle geri döndürülür.
- domain
- Küçük harfe çevrilmiş alan adı (uluslararası alan adları punycode biçiminde) veya syntaxValid false olduğunda null.
- syntaxValid
- Adresin sözdizimi açısından geçerli olup olmadığı. Posta kutusunun varlığını veya teslim edilebilirliği kontrol etmez.
- isDisposable
- Alan adının bilinen bir tek kullanımlık/geçici e-posta sağlayıcısıyla eşleşip eşleşmediği — doğrudan, bir üst alan adı üzerinden veya tek kullanımlık alan adlarına hizmet verdiği bilinen bir posta sunucusu üzerinden. syntaxValid false olduğunda her zaman false.
- normalizedEmail
- Boşlukları temizlenmiş, küçük harfe çevrilmiş ve alan adı punycode biçiminde olan adres veya syntaxValid false olduğunda null.
- canonicalEmail
- Varsa +etiketi kaldırılmış normalizedEmail (Gmail için ayrıca noktalar kaldırılır ve googlemail.com, gmail.com'a eşlenir) — aynı kişinin iki kez kaydolduğunu fark etmek için saklayın. syntaxValid false olduğunda null.
- disposableSource
- isDisposable'ın neden true olduğu: list (alan adının kendisi listede), parent_domain (bir üst alan adı listede, ör. a.b.mailinator.com) veya mx_host (alan adının posta sunucusu bilinen tek kullanımlık alan adlarına hizmet veriyor). isDisposable false olduğunda null.
- isFreeProvider
- Alan adının gmail.com veya outlook.com gibi bir bireysel posta kutusu sağlayıcısı olup olmadığı. Yalnızca bilgi amaçlıdır — kararı asla değiştirmez.
- isRoleAccount
- Yerel kısmın admin@, info@ veya noreply@ gibi bir rol adresi olup olmadığı.
- didYouMean
- Adresin tamamı için olası bir yazım hatası düzeltmesi (john@gmial.com → john@gmail.com) veya null. Kendi çalışan posta sunucusu olan bir alan adı, yaygın bir sağlayıcıdan tek düzenleme uzaklıkta değilse “düzeltilmez”.
- mx.status
- found (MX kayıtları var), implicit (MX yok ama A/AAAA kaydı var), none (ikisi de yok), null_mx (alan adı posta kabul etmediğini beyan ediyor), no_domain (alan adı yok) veya unknown (sorgu başarısız oldu ya da zaman aşımına uğradı). syntaxValid false olduğunda mx nesnesinin tamamı null olur.
- mx.host
- status found olduğunda en düşük tercih değerine sahip MX ana makinesi, aksi halde null. Tek tek posta kutusunun var olup olmadığı hakkında bir şey söylemez.
- verdict
- accept, review veya reject — reasons içindeki koşulların en ağırı. Nihai bir karar değil, kendi politikanız için bir öneridir.
- reasons
- Karşılanan her koşul, en ağırı önce gelecek şekilde; verdict accept olduğunda boştur. Aşağıdaki “Kararlar ve gerekçe kodları” bölümüne bakın.
Hatalar
- 400
- Hatalı biçimlendirilmiş istek gövdesi. Toplu: empty_batch veya batch_too_large (100'den fazla adres). Kayıt kontrolü: invalid_ip. Liste işleri: invalid_body, empty_job veya job_too_large (100.000'den fazla adres). Geçersiz bir e-posta adresi asla 400 döndürmez — reject kararı ve invalid_syntax gerekçesi içeren bir sonuç döndürür.
- 401
- Eksik veya geçersiz API anahtarı.
- 403
- POST /v1/email/validate: isteğin Origin/Referer değeri anahtarın izin verilen origin listesinde değil (CORS başlığı ayarlanmaz, bu nedenle tarayıcı JSON gövdesinden bağımsız olarak yanıtı engeller). Gizli anahtarlı uç noktalar: yayınlanabilir bir anahtar kullanıldı.
- 404
- job_not_found — hesabınızda bu kimliğe sahip bir liste işi yok.
- 409
- job_not_completed — iş hâlâ kuyrukta veya işleniyor ya da başarısız oldu; sonuçlar yalnızca iş tamamlandıktan sonra indirilebilir.
- 410
- job_expired — işin yüklenen adresleri ve sonuçları silindi (oluşturulduktan 7 gün sonra).
- 413
- body_too_large — 10 MB'tan büyük bir CSV iş yüklemesi.
- 415
- Ne JSON ne de text/csv olan bir liste işi gövdesi.
- 429
- Dakika başına hız sınırı veya planın aylık istek kotası aşılacaksa monthly_limit_exceeded — hangisi olduğunu anlamak için hatalar ve hız sınırlarına bakın. Kotayı aşacak bir toplu istek veya liste işi, herhangi bir işlem yapılmadan önce bütünüyle reddedilir.
- 503
- job_storage_unavailable — bir liste işi depolanamadı. Hiçbir ücret alınmadı; yeniden deneyin.
Örnek
İstek
curl https://api.watch-ip.com/v1/email/validate \
-H "X-Api-Key: YOUR_PUBLISHABLE_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "John.Doe+news@Gmial.com"}'Yanıt
{
"email": "John.Doe+news@Gmial.com",
"domain": "gmial.com",
"syntaxValid": true,
"isDisposable": false,
"normalizedEmail": "john.doe+news@gmial.com",
"canonicalEmail": "john.doe@gmial.com",
"disposableSource": null,
"isFreeProvider": false,
"isRoleAccount": false,
"didYouMean": "john.doe+news@gmail.com",
"mx": {
"status": "none",
"host": null
},
"verdict": "reject",
"reasons": [
"no_mail_server",
"typo_suspected"
]
}Kararlar ve gerekçe kodları
Her koşul bir asgari karar belirler; en ağırı geçerli olur ve reasons, en ağırı önce gelecek şekilde hepsini listeler. Ücretsiz sağlayıcı adresinin kabul edilebilir olup olmadığı size bırakılmıştır — kararı asla değiştirmez.
- invalid_syntax
- Reject. Adres sözdizimi açısından geçerli değil (uzunluk sınırları, izin verilen karakterler, nokta konumu, IP değişmezi yerine gerçek bir alan adı). Tırnak içindeki yerel kısımlar da reddedilir — kurallara uygundur ancak kayıtta fiilen hiç kullanılmaz.
- domain_not_found
- Reject. Alan adı DNS'te mevcut değil.
- no_mail_server
- Reject. Alan adı hiç posta kabul etmediğini beyan ediyor (“null MX”) ya da ne MX ne de A/AAAA kaydı var.
- disposable_domain
- Reject. Alan adı, bir üst alan adı veya alan adının posta sunucusu bilinen tek kullanımlık/geçici e-posta sağlayıcılarıyla eşleşiyor — disposableSource'a bakın.
- typo_suspected
- Review. didYouMean, gmial.com → gmail.com gibi olası bir düzeltme içerir.
- role_account
- Review. Yerel kısım admin@, info@, support@ veya noreply@ gibi, genellikle kişisel değil ortak kullanılan bir rol adresi.
- implicit_mx
- Review. Alan adının MX kaydı yok; posta A/AAAA adresine geri döner ki bu gerçek posta alan adlarında nadirdir.
- dns_unavailable
- Review. DNS sorgusu başarısız oldu veya zaman aşımına uğradı, bu yüzden alan adının posta yapılandırması bilinmiyor (mx.status: unknown). Adres aleyhine bir kanıt değildir.
Toplu kontrol
POST/v1/email/batch
Tek bir istekte 1–100 adresi, POST /v1/email/validate ile aynı kontroller ve aynı sonuç yapısıyla kontrol eder; giriş sırasına göre adres başına bir sonuç döner. { "emails": [...] } gönderin. Aynı alan adındaki adresler tek bir DNS sorgusunu paylaşır. Aylık plan kotanızdan adres başına bir istek düşülür; kotayı aşacak bir toplu istek 429 monthly_limit_exceeded ile bütünüyle reddedilir. Dakika başına hız sınırı açısından çağrının tamamı tek bir istek sayılır. Yalnızca gizli anahtar.
İstek
curl https://api.watch-ip.com/v1/email/batch \
-H "Authorization: Bearer YOUR_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"emails": ["user@gmail.com", "someone@mailinator.com"]}'Yanıt
{
"results": [
{ "email": "user@gmail.com", "verdict": "accept", "reasons": [], ... },
{ "email": "someone@mailinator.com", "isDisposable": true, "disposableSource": "list", "verdict": "reject", "reasons": ["disposable_domain"], ... }
]
}E-posta liste işleri
POST/v1/email/jobs
Arka planda 100.000'e kadar adresi kontrol eder. JSON { "emails": [...], "filename": "..." } veya en fazla 10 MB'lık bir text/csv gövdesi gönderin: başlığı email (ayrıca e-mail, email address, email_address veya mail; büyük/küçük harf duyarsız) olan sütun kullanılır, hiçbir başlık bunu belirtmiyorsa ilk sütun kullanılır; virgül, noktalı virgül ve sekme ayırıcıları algılanır. İş, oluşturulduğu anda ücretlendirilir — farklı her adres için bir istek (tam eşleşme), yani yinelenen adresler kontrol edilir ama bir kez ücretlendirilir — ve aylık kotanızı aşacak bir liste bütünüyle reddedilir. Bir işin bir kısmı yeniden denemelerden sonra işlenemezse iş failed olarak işaretlenir ve işlenmeyen kısmın kredileri iade edilir. İş nesnesiyle birlikte 202 yanıtı verir. Yalnızca gizli anahtar; aynı işler kontrol panelindeki Email lists sayfasından da yüklenip indirilebilir.
İstek
curl https://api.watch-ip.com/v1/email/jobs \
-H "Authorization: Bearer YOUR_SECRET_KEY" \
-H "Content-Type: text/csv" \
--data-binary @newsletter.csvYanıt
{
"id": "5b0d6f5e-8a51-4f7e-9d0e-2c1f3f7f8a11",
"status": "queued",
"source": "api",
"filename": null,
"total": 12840,
"credits": 12512,
"processed": 0,
"summary": null,
"createdAt": "2026-09-28T10:00:00.000Z",
"completedAt": null,
"expiresAt": "2026-10-05T10:00:00.000Z"
}İş durumu
GET/v1/email/jobs/{id}
Aynı iş nesnesini döndürür. status completed olana kadar yoklayın; yoklama ücretlendirilmez.
- status
- queued → processing → completed. failed: listenin bir kısmı yeniden denemelerden sonra işlenemedi; sonuç yoktur ve işlenmeyen kısmın kredileri iade edildi. expired: yüklenen adresler ve sonuçlar oluşturulduktan 7 gün sonra silindi.
- total
- Gönderilen satırlar, yinelenenler dahil.
- credits
- Ücretlendirilen istekler: farklı her adres için bir tane.
- processed
- Şimdiye kadar kontrol edilen satırlar.
- summary
- Tamamlandığında: karar başına (accept/review/reject) ve ortaya çıkan her gerekçe kodu başına satır sayıları. Öncesinde null.
- expiresAt
- Yüklenen adreslerin ve sonuçların silineceği zaman.
İş sonuçları
GET/v1/email/jobs/{id}/results
Gönderilen her satır için bir satır içeren, gönderim sırasına göre (yinelenenler dahil) bir CSV indirir. Sütunlar: email, normalized_email, verdict, reasons, syntax_valid, is_disposable, disposable_source, is_free_provider, is_role_account, did_you_mean, mx_status, mx_host. reasons noktalı virgülle ayrılır, boş hücreler null anlamına gelir ve sözdizimi geçersiz adreslerde mx_status boştur (hiçbir sorgu yapılmadı). =, +, - veya @ ile başlayan geçersiz bir adresin önüne, elektronik tablo uygulamaları onu formül olarak çalıştırmasın diye bir kesme işareti eklenir. İş tamamlanana kadar 409, süresi dolduktan sonra 410. İndirme ücretlendirilmez.
İstek
curl https://api.watch-ip.com/v1/email/jobs/5b0d6f5e-8a51-4f7e-9d0e-2c1f3f7f8a11/results \
-H "Authorization: Bearer YOUR_SECRET_KEY" -o results.csvKayıt kontrolü
POST/v1/signup/check
Bir kaydı e-posta adresi ve IP'sine göre tek çağrıda puanlar; kayıt formu gönderildiğinde arka ucunuzdan çağrılır (tarayıcıda hesaplanan bir karar sahte olabilir). { "email": "...", "ip": "...", "userAgent": "..." } gönderin — userAgent isteğe bağlıdır. Yanıt; tam e-posta kontrolü sonucunu (email), IP'nin ülkesini ve ASN'sini ve — güvenlik verisi içeren planlarda — VPN/Tor/veri merkezi/tehdit göstergelerini (ip), e-posta alan adının herkese açık kayıt (RDAP) verilerine göre gün cinsinden yaşını (emailDomainAgeDays; bilinmediğinde ve tanınmış bireysel sağlayıcılar için null), 0–100 arası bir puanı (aşağıdaki gerekçe ağırlıklarının toplamı, en fazla 100) ve bir kararı içerir: 60 ve üzeri reject, 25 ve üzeri review, aksi halde accept. Güvenlik verisi olmayan bir planda ip.security null olur, puan yalnızca e-posta sinyallerini kullanır ve reasons ip_security_unavailable içerir. Bir istek sayılır. Yalnızca gizli anahtar.
- invalid_syntax
- 70
- domain_not_found · no_mail_server · disposable_domain
- her biri 60
- ip_tor · ip_threat
- her biri 40
- ip_vpn
- 25
- new_domain
- 25 — e-posta alan adı 30 günden kısa süre önce kaydedildi
- ip_datacenter
- 20 — yalnızca IP zaten bir VPN veya Tor çıkışı değilse
- automated_user_agent
- 20 — sağlanan userAgent bir bot veya betik gibi görünüyor
- typo_suspected
- 15
- role_account · implicit_mx
- her biri 10
- dns_unavailable
- 5
- ip_security_unavailable
- 0 — bilgi amaçlı: bu planda güvenlik verisi yok
İstek
curl https://api.watch-ip.com/v1/signup/check \
-H "Authorization: Bearer YOUR_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "jane@new-startup.io", "ip": "203.0.113.1"}'Yanıt
{
"email": { "email": "jane@new-startup.io", "verdict": "accept", "reasons": [], ... },
"ip": {
"ip": "203.0.113.1",
"country": "US",
"asn": 64500,
"asOrganization": "Example Hosting",
"security": { "isTor": false, "isVpn": false, "isDatacenter": true, "isThreat": false, "isSanctionedNetwork": false }
},
"emailDomainAgeDays": 12,
"score": 45,
"verdict": "review",
"reasons": ["new_domain", "ip_datacenter"]
}Sınırlar
Kontrol edilen her adres, planınızın paylaşılan aylık kotasından bir istek olarak düşülür — tekli kontrol, toplu istekteki her adres, liste işindeki farklı her adres — ve bir kayıt kontrolü bir istektir. Toplu istekler ve liste işleri bütünüyle kabul edilir veya reddedilir, asla kısmen yerine getirilmez. Dakika başına hız sınırı öğeleri değil HTTP çağrılarını sayar: en fazla 100 IP veya e-posta adresi içeren bir toplu istek tek bir istek sayılır; her öğe ise aylık istek kotasına yine ayrı ayrı sayılır. Liste işi yüklemeleri ve sonuçları, iş oluşturulduktan 7 gün sonra silinir. DNS sorgularının kısa bir zaman bütçesi vardır: biri başarısız olduğunda veya zaman aşımına uğradığında sonuç, hata yerine mx.status unknown ve dns_unavailable gerekçesine düşer. Tek kullanımlık alan adı verileri, topluluk tarafından sürdürülen üç açık kaynaklı listeden birleştirilir, birkaç saatte bir yenilenir ve listelenen alan adlarına hizmet verdiği gözlemlenen posta sunucularıyla genişletilir — veri kaynaklarına bakın. Çok yeni bir tek kullanımlık sağlayıcı henüz işaretlenmemiş olabilir. Tüm kontroller alan adı ve adres düzeyindedir: hiçbir posta kutusuyla iletişim kurulmaz, dolayısıyla hiçbir sonuç bir posta kutusunun var olduğunu, kime ait olduğunu veya postanın oraya ulaşacağını kanıtlamaz.
İlgili sayfalar
- Kimlik DoğrulamaYayınlanabilir ve gizli anahtarlar, origin kilitleme ve hız sınırları.
- GET /v1/geo referansıZiyaretçi konum belirleme endpoint'i için tam alan referansı.
- Tek kullanımlık e-posta tespitiTek kullanımlık, yanlış yazılmış ve posta sunucusu olmayan kayıt e-postalarını tek tek veya toplu olarak işaretleyin.
- Kayıt kötüye kullanımı önlemeE-posta ve IP sinyallerini bir kayıt kararında birleştirin: kabul, inceleme veya ret.
- Veri kaynaklarıHer yanıt alanını hangi kaynağın desteklediği ve bilinen boşlukları.