Webhook'lar
Abone olduğunuz kategorilerde bir değişiklik olduğunda yalnız "bir şey değişti" demiyoruz: ilanın kendisini — şirket, kategori, ilan tarihi, türü, kısa özet ve gazete PDF bağlantısı — gönderiyoruz. Sisteminiz ikinci bir istek atmadan işe başlayabilir.
- En çok 5 adres; her biri kendi kategorileriyle (boş = tümü).
- Takip ettiğiniz şirketlerde yeni ilan yayımlandığı gün gönderilir; aynı ilan ikinci kez gönderilmez.
- Bir şirketin aynı taramadaki satırları tek istekte gelir.
- Yönetim: API uçları ya da panel › API Anahtarları.
İstek
POST https://sisteminiz.ornek.com/ulawk
Content-Type: application/json; charset=utf-8
User-Agent: Ulawk-Webhook/2.0
X-Ulawk-Olay: sirket.degisiklik
X-Ulawk-Teslim: msg_3f9c1a0b7d2e4c5f6a7b8c9d
X-Ulawk-Imza: t=1760572800,v1=5e2b…WebhookYuku
olaystringzorunluDeğerler:sirket.degisiklik,testsurumintegerzorunluteslim_idstringzorunlutestbooleanzorunluzamanstring (date-time)zorunlusirketobjectzorunluidinteger | stringzorunluŞirket kimliği: gerçek anahtarda sayısal (ör. 1234); deneme anahtarında DENEME-… metni.unvanstringzorunlunull olabilirmudurlukstringzorunlunull olabilirsicil_nostringzorunlunull olabilirprofilstring (uri)zorunludegisikliklerstring (uri)zorunlu
kategorilerstring[]zorunluDeğerler:durum,adres,ortaklik,sermaye,yetkililer,unvan,esas_sozlesme,diger,kapandidegisikliklerobject[]zorunlukategoristringzorunluDeğerler:durum,adres,ortaklik,sermaye,yetkililer,unvan,esas_sozlesme,diger,kapandikategori_adstringzorunlunull olabilirturstringzorunlutarihstring (date)zorunlunull olabilirozetstringzorunluilanobjectzorunlunull olabilirilan_idintegerzorunluilan_tarihistring (date)zorunlunull olabilirilan_turustringzorunlunull olabiliralintistringzorunlunull olabilir
gazete_pdfstring (uri)zorunlunull olabilir
İmzayı doğrulayın
X-Ulawk-Imza: t=<unix saniye>,v1=<hex> — v1 = HMAC-SHA256(gizli, t + "." + ham gövde). Gövdeyi ayrıştırmadan önce, ham baytlar üzerinde hesaplayın; sabit sürede karşılaştırın; t şu andan 300 saniyeden uzaksa reddedin (yeniden oynatma koruması). Anahtar yenilenirken başlıkta birden çok v1 olabilir; biri eşleşirse kabul edin.
import hashlib
import hmac
import time
def ulawk_imzasi_gecerli(gizli, ham_govde, baslik, tolerans=300):
"""gizli: whsec_… · ham_govde: istek gövdesinin HAM baytları · baslik: X-Ulawk-Imza"""
try:
parcalar = [p.strip().split("=", 1) for p in baslik.split(",") if "=" in p]
t = int(next(v for k, v in parcalar if k == "t"))
except (StopIteration, ValueError):
return False
if abs(time.time() - t) > tolerans:
return False
beklenen = hmac.new(gizli.encode(), f"{t}.".encode() + ham_govde, hashlib.sha256).hexdigest()
return any(hmac.compare_digest(beklenen, v) for k, v in parcalar if k == "v1")const crypto = require("node:crypto");
// gizli: whsec_… · hamGovde: istek gövdesinin HAM hali (Buffer) · baslik: X-Ulawk-Imza
function ulawkImzasiGecerli(gizli, hamGovde, baslik, tolerans = 300) {
const parcalar = baslik.split(",").map((p) => p.trim().split("=", 2)).filter((p) => p.length === 2);
const t = Number((parcalar.find(([k]) => k === "t") || [])[1]);
if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > tolerans) return false;
const beklenen = crypto.createHmac("sha256", gizli).update(`${t}.`).update(hamGovde).digest("hex");
return parcalar.some(([k, v]) => k === "v1" && v.length === beklenen.length &&
crypto.timingSafeEqual(Buffer.from(v), Buffer.from(beklenen)));
}
module.exports = { ulawkImzasiGecerli };<?php
// $gizli: whsec_… · $hamGovde: file_get_contents('php://input') · $baslik: $_SERVER['HTTP_X_ULAWK_IMZA']
function ulawk_imzasi_gecerli(string $gizli, string $hamGovde, string $baslik, int $tolerans = 300): bool {
$t = null;
$imzalar = [];
foreach (explode(',', $baslik) as $parca) {
[$k, $v] = array_pad(explode('=', trim($parca), 2), 2, '');
if ($k === 't') { $t = (int) $v; }
if ($k === 'v1') { $imzalar[] = $v; }
}
if ($t === null || abs(time() - $t) > $tolerans) { return false; }
$beklenen = hash_hmac('sha256', $t . '.' . $hamGovde, $gizli);
foreach ($imzalar as $v) {
if (hash_equals($beklenen, $v)) { return true; }
}
return false;
}Yeniden deneme ve mükerrer
- 2xx dışındaki her yanıt ya da zaman aşımı artan aralıklarla yeniden denenir (30 saniyeden 6 saate, toplam 7 deneme).
- Yeniden denemeler aynı
teslim_idve gövdeyi taşır: mükerreriX-Ulawk-Teslimile ayıklayın. - Art arda 20 başarısızlıkta webhook durur;
PATCH {"aktif": true}ya da panelden yeniden açın. - En çok 5 saniye bekleriz: hızlıca 2xx dönüp işi sonra yapın.
Güvenlik
Yalnız https. Özel, yerel, bağlantı-yerel ya da ayrılmış ağlara çözülen adresler reddedilir; bağlantı doğrulanan IP'ye sabitlenir; yönlendirme izlenmez.