# Company changes

`GET https://ulawk.com/api/v1/sirketler/{sirket_id}/degisiklikler/`

Every change with its source gazette: officer appointments/departures, capital, ownership, name/address, articles and status changes in one chronological feed (newest first). Also returns `son_gazete`.

## Authentication

Two headers on every request: `X-API-Key` and `X-API-Secret`.

## Path parameters

- `sirket_id` (integer | string, required) — Company id (`id` from `/api/v1/sirketler/`).

## Query parameters

- `tur` (string) — Change type filter.
- `kategoriler` (string) — Comma-separated change category filter: durum, adres, ortaklik, sermaye, yetkililer, unvan, esas_sozlesme, diger, kapandi. Unknown category → 400 `gecersiz_kategori`.
- `sayfa` (integer) — Page number (from 1).
- `adet` (integer) — Records per page (default 100, max 500).

## Response

### 200 — Changes.

- `sirket` (SirketOzet, zorunlu)
- `sirket.id` (integer | string, zorunlu) — Company id: numeric with a live key (e.g. 1234); a DENEME-… string with a sandbox key.
- `sirket.unvan` (string, null, zorunlu) — Registered name.
- `sirket.mudurluk` (string, null, zorunlu) — Registry office (e.g. İSTANBUL).
- `sirket.sicil_no` (string, null, zorunlu) — Trade registry number.
- `son_gazete` (SonGazete, null, zorunlu)
- `son_gazete.ilan_id` (integer, zorunlu)
- `son_gazete.tarih` (string (date), zorunlu)
- `son_gazete.tur` (string, zorunlu)
- `son_gazete.gazete_pdf` (string (uri), null, zorunlu)
- `son_gazete.gazete_arsivde` (boolean, zorunlu)
- `adet` (integer, zorunlu)
- `sayfa` (integer, zorunlu)
- `sayfa_adedi` (integer, zorunlu)
- `sonraki_sayfa` (integer, null, zorunlu)
- `turler[]` (string[], zorunlu) — Types seen for this company.
- `kategoriler[]` (string[], zorunlu)
- `profil_hazir` (boolean, zorunlu)
- `degisiklikler[]` (Degisiklik[], zorunlu)
- `degisiklikler[].tur` (string, zorunlu) — Change type. Değerler: yetkili-atama, yetkili-ayrilma, sermaye, ortaklik, unvan-adres, esas-sozlesme, durum.
- `degisiklikler[].tarih` (string (date), null, zorunlu) — Date of the change.
- `degisiklikler[].ozet` (string, zorunlu) — One-line summary.
- `degisiklikler[].kaynak` (Kaynak, null, zorunlu)
- `degisiklikler[].kaynak.ilan_id` (integer, zorunlu) — The notice the fact comes from.
- `degisiklikler[].kaynak.ilan_tarihi` (string (date), zorunlu) — Publication date of the notice.
- `degisiklikler[].kaynak.ilan_turu` (string, zorunlu) — Trade Registry Gazette notice type.
- `degisiklikler[].kaynak.alinti` (string, zorunlu) — Verbatim quote from the notice text.
- `degisiklikler[].kaynak.alinti_dogrulandi` (boolean, zorunlu) — Whether the quote was found verbatim in the notice.
- `degisiklikler[].kaynak.gazete_pdf` (string (uri), zorunlu) — Gazette PDF.
- `degisiklikler[].kaynak.vurgu` (Vurgu, null, zorunlu)
- `degisiklikler[].kaynak.vurgu.sayfa` (integer, zorunlu) — Gazette page (from 1).
- `degisiklikler[].kaynak.vurgu.sayfa_gorsel` (string (uri), zorunlu) — PNG image of the page.
- `degisiklikler[].kaynak.vurgu.kutular[]` (number[][], zorunlu) — Where the fact sits on the page: proportional [x0, y0, x1, y1] boxes (0–1, top-left origin).
- `degisiklikler[].kaynak.vurgu.kutu_birimi` (string, zorunlu) — Description of the box unit.
- `degisiklikler[].gazete_pdf` (string (uri), null, zorunlu) — PDF of the source gazette.
- `degisiklikler[].kategori` (string, zorunlu) — Fixed change category. Değerler: durum, adres, ortaklik, sermaye, yetkililer, unvan, esas_sozlesme, diger, kapandi.
- `degisiklikler[].isim` (string, null)
- `degisiklikler[].sifat` (string, null)
- `degisiklikler[].onceki` (string, null)
- `degisiklikler[].yeni` (string, null)
- `degisiklikler[].pay_tutari` (string, null)
- `degisiklikler[].pay_orani` (string, null)
- `degisiklikler[].alan` (string, null)
- `degisiklikler[].deger` (string, null)
- `degisiklikler[].madde` (string, null)
- `degisiklikler[].baslik` (string, null)
- `degisiklikler[].aciklama` (string, null)

```json
{
  "sirket": {
    "id": "DENEME-TASFIYE",
    "unvan": "ÖRNEK DENEME İNŞAAT LİMİTED ŞİRKETİ (TASFİYE HALİNDE)",
    "mudurluk": "ANTALYA",
    "sicil_no": "DENEME-TASFIYE"
  },
  "son_gazete": {
    "ilan_id": 9050002,
    "tarih": "2026-10-12",
    "tur": "ALACAKLILARA ÇAĞRI İLANI",
    "gazete_pdf": "https://ulawk.com/api/v1/ilanlar/9050002/pdf/",
    "gazete_arsivde": true
  },
  "adet": 4,
  "sayfa": 1,
  "sayfa_adedi": 100,
  "sonraki_sayfa": null,
  "turler": [
    "durum",
    "esas-sozlesme"
  ],
  "kategoriler": [
    "durum",
    "esas_sozlesme"
  ],
  "profil_hazir": true,
  "degisiklikler": [
    {
      "tur": "durum",
      "tarih": "2026-10-12",
      "ozet": "Alacaklılara çağrı",
      "kaynak": {
        "ilan_id": 9050002,
        "ilan_tarihi": "2026-10-12",
        "ilan_turu": "ALACAKLILARA ÇAĞRI İLANI",
        "alinti": "",
        "alinti_dogrulandi": false,
        "gazete_pdf": "https://ulawk.com/api/v1/ilanlar/9050002/pdf/",
        "vurgu": null
      },
      "gazete_pdf": "https://ulawk.com/api/v1/ilanlar/9050002/pdf/",
      "aciklama": "Deneme açıklaması: Alacaklılara çağrı.",
      "kategori": "durum"
    },
    {
      "tur": "yetkili-atama",
      "tarih": "2026-10-05",
      "ozet": "Zeynep Örnekoğlu göreve başladı (Tasfiye Memuru · Münferit)",
      "kaynak": {
        "ilan_id": 9050001,
        "ilan_tarihi": "2026-10-05",
        "ilan_turu": "TASFİYEYE GİRİŞ",
        "alinti": "tasfiye memuru olarak",
        "alinti_dogrulandi": true,
        "gazete_pdf": "https://ulawk.com/api/v1/ilanlar/9050001/pdf/",
        "vurgu": null
      },
      "gazete_pdf": "https://ulawk.com/api/v1/ilanlar/9050001/pdf/",
      "isim": "Zeynep Örnekoğlu",
      "sifat": "Tasfiye Memuru",
      "kategori": "yetkililer"
    }
  ]
}
```

### 400 — Invalid parameter (`gecersiz_parametre`, `gecersiz_kategori`, `gecersiz_tarih`…) or the endpoint does not support sandbox keys (`deneme_desteklenmiyor`).


```json
{
  "hata": "gecersiz_kategori",
  "detay": "Bilinmeyen kategori: bilinmeyen. Geçerli: durum, adres, ortaklik, sermaye, yetkililer, unvan, esas_sozlesme, diger, kapandi.",
  "hata_ayrinti": {
    "kod": "gecersiz_kategori",
    "mesaj": "Bilinmeyen kategori: bilinmeyen. Geçerli: durum, adres, ortaklik, sermaye, yetkililer, unvan, esas_sozlesme, diger, kapandi.",
    "taraf": "istemci",
    "kaynak": null,
    "tekrar_denenebilir": false,
    "tekrar_sn": null
  },
  "gecerli_kategoriler": [
    "durum",
    "adres",
    "ortaklik",
    "sermaye",
    "yetkililer",
    "unvan",
    "esas_sozlesme",
    "diger",
    "kapandi"
  ]
}
```

### 404 — Not found or no access (`bulunamadi`).


```json
{
  "hata": "bulunamadi",
  "detay": "Şirket bulunamadı ya da erişim yetkiniz yok.",
  "hata_ayrinti": {
    "kod": "bulunamadi",
    "mesaj": "Şirket bulunamadı ya da erişim yetkiniz yok.",
    "taraf": "istemci",
    "kaynak": null,
    "tekrar_denenebilir": false,
    "tekrar_sn": null
  }
}
```

### 503 — The official source is unreachable right now (`kaynak_erisilemiyor`, taraf kaynak). Sandbox: DENEME-KAYNAK-KAPALI.

Retry-After: `300`

```json
{
  "hata": "kaynak_erisilemiyor",
  "detay": "Ticaret Sicili Gazetesi şu an yanıt vermiyor; kısa süre sonra yeniden deneyin. (Deneme ortamı benzetimi.)",
  "hata_ayrinti": {
    "kod": "kaynak_erisilemiyor",
    "mesaj": "Ticaret Sicili Gazetesi şu an yanıt vermiyor; kısa süre sonra yeniden deneyin. (Deneme ortamı benzetimi.)",
    "taraf": "kaynak",
    "kaynak": "ttsg",
    "tekrar_denenebilir": true,
    "tekrar_sn": 300
  }
}
```

### 401 — Missing or invalid key (`yetkisiz`).


```json
{
  "hata": "yetkisiz",
  "detay": "Geçerli X-API-Key başlığı gerekli (panel › API).",
  "hata_ayrinti": {
    "kod": "yetkisiz",
    "mesaj": "Geçerli X-API-Key başlığı gerekli (panel › API).",
    "taraf": "istemci",
    "kaynak": null,
    "tekrar_denenebilir": false,
    "tekrar_sn": null
  }
}
```

### 429 — Hourly rate limit exceeded (`hiz_siniri`); the Retry-After header gives the seconds until reset.

Retry-After: `2311`

```json
{
  "hata": "hiz_siniri",
  "detay": "Saatlik istek sınırı aşıldı (600). Bir sonraki saatte tekrar deneyin.",
  "hata_ayrinti": {
    "kod": "hiz_siniri",
    "mesaj": "Saatlik istek sınırı aşıldı (600). Bir sonraki saatte tekrar deneyin.",
    "taraf": "istemci",
    "kaynak": null,
    "tekrar_denenebilir": true,
    "tekrar_sn": 2311
  }
}
```

### 500 — Unexpected error (`ic_hata`, taraf ulawk); retry shortly.

Retry-After: `60`

```json
{
  "hata": "ic_hata",
  "detay": "Beklenmeyen bir hata oluştu; kısa süre sonra yeniden deneyin.",
  "hata_ayrinti": {
    "kod": "ic_hata",
    "mesaj": "Beklenmeyen bir hata oluştu; kısa süre sonra yeniden deneyin.",
    "taraf": "ulawk",
    "kaynak": null,
    "tekrar_denenebilir": true,
    "tekrar_sn": 60
  }
}
```

## Request

```bash
curl "https://ulawk.com/api/v1/sirketler/DENEME-TASFIYE/degisiklikler/?kategoriler=durum%2Cyetkililer" \
  -H "X-API-Key: ulk_DENEME_ANAHTARINIZ" \
  -H "X-API-Secret: ulsk_DENEME_GIZLI_ANAHTARINIZ"
```
