Skip to content
Developers

Webhooks

When something changes in your categories we do not just say "something changed": we send the notice itself — company, category, notice date, type, a short summary and the gazette PDF link — so your system can act without a second request.

  • Up to 5 addresses, each with its own categories (empty = all).
  • Sent on the day a new notice is published for a company you follow; the same notice is never sent twice.
  • The rows of one company from the same scan arrive in one request.
  • Manage via the API endpoints or Dashboard › API keys.

Request

HTTP
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

  • olaystringrequired
    Values: sirket.degisiklik, test
  • surumintegerrequired
  • teslim_idstringrequired
  • testbooleanrequired
  • zamanstring (date-time)required
  • sirketobjectrequired
    • idinteger | stringrequired
      Company id: numeric with a live key (e.g. 1234); a DENEME-… string with a sandbox key.
    • unvanstringrequirednullable
    • mudurlukstringrequirednullable
    • sicil_nostringrequirednullable
    • profilstring (uri)required
    • degisikliklerstring (uri)required
  • kategorilerstring[]required
    Values: durum, adres, ortaklik, sermaye, yetkililer, unvan, esas_sozlesme, diger, kapandi
  • degisikliklerobject[]required
    • kategoristringrequired
      Values: durum, adres, ortaklik, sermaye, yetkililer, unvan, esas_sozlesme, diger, kapandi
    • kategori_adstringrequirednullable
    • turstringrequired
    • tarihstring (date)requirednullable
    • ozetstringrequired
    • ilanobjectrequirednullable
      • ilan_idintegerrequired
      • ilan_tarihistring (date)requirednullable
      • ilan_turustringrequirednullable
      • alintistringrequirednullable
    • gazete_pdfstring (uri)requirednullable

Verify the signature

X-Ulawk-Imza: t=<unix seconds>,v1=<hex> — v1 = HMAC-SHA256(secret, t + "." + raw body). Compute it on the raw bytes before parsing, compare in constant time, and reject if t is more than 300 seconds from now (replay protection). During secret rotation the header may carry several v1 values; accept if any matches.

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

Retries and duplicates

  • Any non-2xx answer or timeout is retried with growing waits (from 30 seconds up to 6 hours, 7 attempts in total).
  • Retries carry the same teslim_id and body: drop duplicates by X-Ulawk-Teslim.
  • After 20 consecutive failures the webhook is paused; re-enable with PATCH {"aktif": true} or in the dashboard.
  • We wait at most 5 seconds: answer 2xx quickly and do the work afterwards.

Security

https only. Addresses resolving to private, loopback, link-local or reserved networks are refused; the connection is pinned to the verified IP; redirects are not followed.

Markdown · OpenAPI · llms.txt · © 2026 Ulawk