Dasturchilar → Webhooks
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.
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 -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.
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.
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.
t=1794300000,v1=hex(HMAC_SHA256(secret, "1794300000." + raw_body))
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", ""))
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);
}
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))
}
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.
| domain.registered | Hisobingizda domen ro‘yxatdan o‘tkazildi. |
| domain.renewed | Domenning amal qilish muddati uzaytirildi (yangilash). |
| domain.expiring | Domenning muddati 30, 7 yoki 1 kundan keyin tugaydi. |
| domain.expired | Domenning muddati kecha tugadi. |
| domain.nameservers.updated | Domenning nameserverlari o‘zgartirildi. |
| domain.transfer.started | Reyestrda kiruvchi yoki chiquvchi transfer so‘raldi. |
| domain.transfer.completed | Transfer yakunlandi. |
| domain.transfer.failed | Transfer rad etildi yoki bekor qilindi. |
| dns.zone.created | DNS zonasi yaratildi. |
| dns.zone.deleted | DNS zonasi o‘chirildi. |
| dns.record.created | DNS yozuvi qo‘shildi. |
| dns.record.updated | DNS yozuvi o‘zgartirildi. |
| dns.record.deleted | DNS yozuvi o‘chirildi. |
| ssl.issued | Sertifikat birinchi marta berildi. |
| ssl.renewed | Sertifikat yangilandi. |
| ssl.expiring | Sertifikatning muddati 7 kundan keyin tugaydi va u hali yangilanmagan. |
| email.mailbox.created | Pochta domenlaringizdan biriga pochta qutisi qo‘shildi. |
| email.mailbox.deleted | Pochta qutisi va undagi xatlar o‘chirildi. |
| email.forwarding.enabled | Domen uchun email yo‘naltirish yoqildi. |
| email.forwarding.disabled | Domen uchun email yo‘naltirish siz tomoningizdan yoki domen talablarga javob bermay qolgani sababli o‘chirildi (sababi hodisada ko‘rsatilgan). |
| webhook.test | Test 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.