Vývojáři → Webhooks

Webhooky

Když se ve vašem účtu něco stane, NameOcean odešle podepsanou JSON událost na váš HTTPS endpoint, takže váš kód může reagovat a nemusí API opakovaně dotazovat.

Přidat endpoint

V Nástěnka → Webhooky, přes API, nebo požádejte svou AI přes MCP (create_webhook). Zvolte typy událostí, skupiny jako dns.*, nebo všechny události. Odpověď obsahuje podpisový klíč (whsec_…).

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 musí být https na veřejném serveru. Odpovězte libovolným kódem 2xx do 10 sekund; náročnější zpracování proveďte až po odpovědi.

Co obdržíte

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"}
  }
}

ID události zůstává stejné i při opakovaném nebo znovu odeslaném doručení: použijte ho k přeskočení událostí, které jste už zpracovali. Události mohou přicházet v jiném pořadí.

Ověření podpisu

t je unixový čas požadavku, v1 je hexadecimální HMAC-SHA256 z t, tečky a nezpracovaného těla, podepsaný Vaším tajným klíčem. Vypočítejte jej z nezpracovaných bajtů ještě před parsováním JSON, porovnávejte v konstantním čase a odmítejte časová razítka starší než pět minut.

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))
}

Opakované pokusy a vypnutí

Doručení bez odpovědi, s vypršením časového limitu, s kódem 5xx, 408 nebo 429 se opakuje po 1m, 5m, 30m, 2h, 5h, 10h, 10h: 8 pokusů během přibližně jednoho dne. Jakýkoli jiný kód 4xx selže okamžitě. Po 5 po sobě jdoucích definitivně neúspěšných doručeních se endpoint vypne a obdržíte e-mail; znovu ho zapnete na nástěnce nebo pomocí PATCH active: true. Každé doručení se stavovým kódem a začátkem vaší odpovědi je uvedeno na nástěnce a na GET /api/v1/webhooks/{id}/deliveries, kde ho můžete znovu odeslat.

Události

domain.registeredVe vašem účtu byla zaregistrována doména.
domain.renewedDatum expirace domény bylo posunuto (prodloužení).
domain.expiringDoména vyprší za 30, 7 nebo 1 den.
domain.expiredDoména včera vypršela.
domain.nameservers.updatedJmenné servery domény se změnily.
domain.transfer.startedU registru byl vyžádán transfer domény k nám nebo od nás.
domain.transfer.completedTransfer byl dokončen.
domain.transfer.failedTransfer byl zamítnut nebo zrušen.
dns.zone.createdByla vytvořena DNS zóna.
dns.zone.deletedDNS zóna byla smazána.
dns.record.createdByl přidán DNS záznam.
dns.record.updatedDNS záznam byl změněn.
dns.record.deletedDNS záznam byl smazán.
ssl.issuedCertifikát byl vystaven poprvé.
ssl.renewedCertifikát byl obnoven.
ssl.expiringCertifikát vyprší za 7 dní a dosud nebyl obnoven.
email.mailbox.createdK jedné z vašich e-mailových domén byla přidána schránka.
email.mailbox.deletedSchránka a její pošta byly smazány.
email.forwarding.enabledPro doménu bylo zapnuto přeposílání e-mailů.
email.forwarding.disabledPro doménu bylo vypnuto přeposílání e-mailů, a to vámi, nebo protože doména přestala splňovat podmínky (důvod je uveden v události).
webhook.testOdesílá se po kliknutí na Odeslat test; filtr událostí koncového bodu se ignoruje.

data obsahují doménu nebo zónu a objekt: záznam (při úpravách s previous), datum vypršení, jmenné servery (s previous). Přesná pole každého objektu odpovídají REST API.

Příchozí e-maily lze také odesílat na URL: nastavte ji pro každou adresu v Přeposílání e-mailů. Tyto požadavky používají stejné hlavičky a podpis, s X-NameOcean-Event: email.received.

Dobré vědět

  • NameOcean odesílá požadavky pouze na veřejné adresy, které znovu ověřuje při každém doručení, a nikdy nenásleduje přesměrování.
  • Pokud klíč unikne, vyměňte ho na nástěnce; události se okamžitě podepisují novým klíčem.
  • Odeslat test okamžitě odešle událost webhook.test bez ohledu na filtr událostí endpointu.