Watch-IP

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ı

email
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.csv

Yanı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.csv

Kayı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