Dasturchilar → Webhooks

Webhooklar

Hisobingizda biror narsa sodir bo‘lganda NameOcean HTTPS endpointingizga imzolangan JSON hodisasini yuboradi, shunda kodingiz qayta-qayta so‘rash o‘rniga darhol javob qaytara oladi.

Endpoint qo‘shish

Boshqaruv paneli → Webhooklar bo‘limida, API orqali yoki MCP orqali sun’iy intellektingizdan so‘rab (create_webhook). Hodisa turlarini, dns.* kabi guruhlarni yoki barcha hodisalarni tanlang. Javobda imzolash kaliti (whsec_…) bo‘ladi.

curl
$ curl -X POST https://nameocean.net/api/v1/webhooks \
    -H "Authorization: Bearer $NAMEOCEAN_API_KEY" -H "Content-Type: application/json" \
    -d '{"url": "https://example.com/hooks/nameocean", "events": ["dns.*", "ssl.issued", "domain.expiring"]}'

URL ommaviy serverdagi https manzil bo‘lishi kerak. 10 soniya ichida istalgan 2xx kodi bilan javob bering; uzoq davom etadigan ishlarni javobdan keyin bajaring.

Siz nimani olasiz

POST https://example.com/hooks/nameocean
Content-Type: application/json
X-NameOcean-Event: dns.record.created
X-NameOcean-Delivery: whd_7c1e0f9a2b3d4e5f6a7b8c9d
X-NameOcean-Signature: t=1794300000,v1=5f2b…

{
  "id": "evt_3a9f1c2e4b5d6a7c8e9f0a1b",
  "type": "dns.record.created",
  "created": "2026-11-10T09:20:00+00:00",
  "data": {
    "zone": "example.com",
    "record": {"id": 4211, "type": "A", "hostname": "www", "ip": "203.0.113.10", "ttl": "1h"}
  }
}

Yuborish qayta urinilganda yoki qayta jo‘natilganda hodisa id’si o‘zgarmaydi: allaqachon qayta ishlangan hodisalarni o‘tkazib yuborish uchun undan foydalaning. Hodisalar tartibsiz kelishi mumkin.

Imzoni tekshiring

t — so'rovning Unix vaqti, v1 esa t, nuqta va xom tanadan iborat qatorning sizning maxfiy kalitingiz bilan hisoblangan hex HMAC-SHA256 qiymati. Uni JSON'ni tahlil qilishdan oldin xom baytlar bo'yicha hisoblang, doimiy vaqtda solishtiring va besh daqiqadan eski vaqt belgilarini rad eting.

X-NameOcean-Signature
t=1794300000,v1=hex(HMAC_SHA256(secret, "1794300000." + raw_body))
Python
import hashlib, hmac, time

def verify(secret: str, header: str, body: bytes, tolerance: int = 300) -> bool:
    fields = dict(part.split("=", 1) for part in header.split(","))
    ts = int(fields["t"])
    if abs(time.time() - ts) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{ts}.".encode() + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, fields.get("v1", ""))
Node.js
import crypto from "node:crypto";

export function verify(secret, header, rawBody, tolerance = 300) {
  const fields = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
  const ts = Number(fields.t);
  if (Math.abs(Date.now() / 1000 - ts) > tolerance) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${ts}.`).update(rawBody).digest("hex");
  const got = Buffer.from(fields.v1 || "", "hex");
  return got.length === 32 && crypto.timingSafeEqual(Buffer.from(expected, "hex"), got);
}
Go
func Verify(secret, header string, body []byte) bool {
	var ts int64
	var v1 string
	for _, part := range strings.Split(header, ",") {
		k, v, _ := strings.Cut(part, "=")
		switch k {
		case "t":
			ts, _ = strconv.ParseInt(v, 10, 64)
		case "v1":
			v1 = v
		}
	}
	if d := time.Now().Unix() - ts; d > 300 || d < -300 {
		return false
	}
	mac := hmac.New(sha256.New, []byte(secret))
	fmt.Fprintf(mac, "%d.", ts)
	mac.Write(body)
	return hmac.Equal([]byte(hex.EncodeToString(mac.Sum(nil))), []byte(v1))
}

Qayta urinishlar va o‘chirish

Javob olinmagan, vaqti tugagan, 5xx, 408 yoki 429 qaytargan yuborish 1m, 5m, 30m, 2h, 5h, 10h, 10h dan keyin qayta urinadi: taxminan bir kun davomida 8 ta urinish. Boshqa har qanday 4xx darhol muvaffaqiyatsiz hisoblanadi. Ketma-ket 5 ta yuborish butunlay muvaffaqiyatsiz bo‘lsa, endpoint o‘chiriladi va sizga email yuboriladi; uni boshqaruv panelida yoki PATCH active: true orqali qayta yoqing. Har bir yuborish holat kodi va javobingizning boshi bilan boshqaruv panelida hamda GET /api/v1/webhooks/{id}/deliveries manzilida ko‘rsatiladi, u yerda uni qayta jo‘natishingiz mumkin.

Hodisalar

domain.registeredHisobingizda domen ro‘yxatdan o‘tkazildi.
domain.renewedDomenning amal qilish muddati uzaytirildi (yangilash).
domain.expiringDomenning muddati 30, 7 yoki 1 kundan keyin tugaydi.
domain.expiredDomenning muddati kecha tugadi.
domain.nameservers.updatedDomenning nameserverlari o‘zgartirildi.
domain.transfer.startedReyestrda kiruvchi yoki chiquvchi transfer so‘raldi.
domain.transfer.completedTransfer yakunlandi.
domain.transfer.failedTransfer rad etildi yoki bekor qilindi.
dns.zone.createdDNS zonasi yaratildi.
dns.zone.deletedDNS zonasi o‘chirildi.
dns.record.createdDNS yozuvi qo‘shildi.
dns.record.updatedDNS yozuvi o‘zgartirildi.
dns.record.deletedDNS yozuvi o‘chirildi.
ssl.issuedSertifikat birinchi marta berildi.
ssl.renewedSertifikat yangilandi.
ssl.expiringSertifikatning muddati 7 kundan keyin tugaydi va u hali yangilanmagan.
email.mailbox.createdPochta domenlaringizdan biriga pochta qutisi qo‘shildi.
email.mailbox.deletedPochta qutisi va undagi xatlar o‘chirildi.
email.forwarding.enabledDomen uchun email yo‘naltirish yoqildi.
email.forwarding.disabledDomen uchun email yo‘naltirish siz tomoningizdan yoki domen talablarga javob bermay qolgani sababli o‘chirildi (sababi hodisada ko‘rsatilgan).
webhook.testTest yuborish tugmasini bosganingizda yuboriladi; endpoint hodisalar filtrini hisobga olmaydi.

data maydonida domen yoki zona va obyekt bo‘ladi: yozuv (yangilanishlarda previous bilan), amal qilish muddati tugash sanasi, nameserverlar (previous bilan). Har bir obyektning aniq maydonlari REST API’dagi bilan bir xil.

Kiruvchi emaillarni ham URL’ga yuborish mumkin: buni Email yo‘naltirish bo‘limida har bir manzil uchun sozlang. Bu so‘rovlar xuddi shu sarlavhalar va imzodan foydalanadi, X-NameOcean-Event: email.received bilan.

Bilish foydali

  • NameOcean faqat ommaviy manzillarga yuboradi, ular har bir yuborishda qayta tekshiriladi, va hech qachon qayta yo‘naltirishlarga ergashmaydi.
  • Agar kalit oshkor bo‘lsa, uni boshqaruv panelida almashtiring; hodisalar darhol yangi kalit bilan imzolanadi.
  • Sinov yuborish endpointning hodisa filtridan qat’i nazar darhol webhook.test hodisasini yuboradi.