> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.insurgateway.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.insurgateway.com/_mcp/server.

# ServiceStatusChange Notification

Bir sigorta şirketinin **kullanıma açık servis operasyonlarında** değişiklik olduğunda gönderilen bildirim tipidir. İki tür değişikliği taşır: bir operasyonun **sağlık statüsünün değişmesi** (kapatılması / yeniden açılması) ve kataloğa bir operasyonun **eklenmesi / katalogdan kaldırılması**.

Payload'ın kökü bir **değişim grubu dizisidir**: her eleman bir `ChangeType` ve o değişikliğin etkilediği operasyonları sigorta şirketi bazında gruplanmış olarak taşır. Böylece tek bildirim birden fazla değişiklik türünü, birden fazla şirketi ve her şirket altında birden fazla operasyonu içerebilir. Aynı kalıp [ProductChange](/push-notifications/productchange-notification) ve [ParameterChange](/push-notifications/parameterchange-notification) bildirimlerinde de kullanılır.

Güncel statülerin tamamı her zaman Kullanıma Açık Servisler API'sinden okunabilir; bildirim yalnızca değişiklikten anlık haberdar olmayı sağlar.

> Header ve zarf (envelope) yapısı için: [Platform Entegrasyon Gereksinimleri](/service-integrations/platform-entegrasyon-gereksinimleri). Bu bildirim tipinde **cevap ve retry davranışı** aşağıda ayrıca tanımlanmıştır: başarı yalnızca HTTP durum koduna göre belirlenir ve transport hatası dışında retry yapılmaz.

---

## Endpoint

| Alan               | Değer               |
| ------------------ | ------------------- |
| HTTP Method        | `POST`              |
| Path               | `/PushNotification` |
| `NotificationType` | `10`                |

---

## Bildirim Ne Zaman Gönderilir?

| Tetikleyici                                                               | `ChangeType`                                               | Kapsam                                                               |
| ------------------------------------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------- |
| Bir operasyonun statüsü InsurGateway yönetim ekranından elle değiştirildi | Yeni statü: `Active`, `AutoDisabled` veya `ManualDisabled` | Değişen **tek** operasyon                                            |
| Katalog senkronunda yeni operasyon(lar) tanımlandı                        | `added`                                                    | Senkronda eklenen **tüm** operasyonlar, şirket bazında gruplanmış    |
| Katalog senkronunda operasyon(lar) tanımdan kaldırıldı                    | `removed`                                                  | Senkronda kaldırılan **tüm** operasyonlar, şirket bazında gruplanmış |

Bir katalog senkronu hem ekleme hem kaldırma ürettiğinde ikisi de **aynı bildirimde**, iki ayrı değişim grubu olarak gelir.

Kataloğun **ilk kez** oluşturulduğu senkron bildirim üretmez; tüm kataloğun "eklendi" olarak duyurulması gürültüden ibaret olurdu.

---

## Kime Gönderilir?

Bildirim **abonelik esaslıdır**: acente yalnızca abone olduğu servis operasyonları için bildirim alır. Abonelik kaydı olmayan acenteye hiçbir bildirim gönderilmez.

| Koşul    | Açıklama                                                                                                                                                                                   |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Abonelik | Abonelik servis operasyonu bazındadır (`ServiceOperationId`; outsource operasyonunda ek olarak `OutsourceProcessId`, süreç başına ayrı abonelik). Şirket ve ürün aboneliğe girmez.         |
| Kapsam   | Değişen kayıt acentenin yetkili olduğu bir şirket/ürüne ait olmalıdır. Kapsam, `GET /api/ServiceAvailabilities/agents/{agentId}` (Acente Bazlı Durumlar) ucundakiyle aynı kuralla çözülür. |

Bu iki koşulun sonucu:

* Acenteye yeni bir ürün tanımlandığında aboneliğe dokunulmaz; o ürünün abone olunan operasyonları kendiliğinden bildirime girer.
* Payload acenteye özeldir: aynı katalog senkronu bir şirkette beş operasyon eklese, ikisine abone olan acente `Operations` altında yalnızca o ikisini görür. Hiçbir operasyonu eşleşmeyen acenteye bildirim gitmez.
* Servis katalogda zaten varken acenteye ürün **sonradan** tanımlanırsa `added` bildirimi gelmez (katalog değişmemiştir); bu durumda `ProductChange` bildirimi gelir ve güncel statüler `GET /api/ServiceAvailabilities/agents/{agentId}` (Acente Bazlı Durumlar) ucundan okunmalıdır.

Abone olunan kayıtlar `GET /api/ServiceAvailabilities/agents/{agentId}/subscriptions` ucundan izlenebilir. Abonelik tanımları şu an InsurGateway tarafından yapılır; self-servis abonelik uçları ayrıca yayınlanacaktır.

---

## Örnek İstek

```bash
curl -X POST "https://platform.ornek.com.tr/insurgw/PushNotification" \
  -H "Content-Type: application/json" \
  -H "x-api-key: 9f3c1e8a-2b4d-1234-5678-deadbeefcafe" \
  -d '{
    "ReferanceNo": "10025_20260810110500123a1b2c_0_0",
    "SubReferanceNo": "a1b2c3d4-e5f6-7890abcdef1234567890",
    "RequestKeyValueSet": null,
    "RequestObject": {
      "NotificationType": 10,
      "Payload": "[{\"ChangeType\":\"ManualDisabled\",\"Reason\":\"Sigorta şirketi bakım bildirimi.\",\"StatusDate\":\"2026-08-10T11:05:00+03:00\",\"Values\":[{\"InsuranceCompanyId\":12,\"InsuranceCompanyName\":\"Örnek Sigorta\",\"Operations\":[{\"ProductId\":27,\"ProductName\":\"Kasko\",\"ServiceOperationId\":118,\"ServiceOperationName\":\"Teklif\",\"ServiceName\":\"ProposalService\",\"OutsourceProcessId\":null,\"OutsourceProcessName\":null}]}]}]"
    }
  }'
```

> `ReferanceNo` opak bir idempotency anahtarıdır; format `{AgentId}_{zamanDamgası+benzersiz}_0_0` şeklindedir ve aynı bildirimin retry'larında **değişmez**.

---

## Parse Edilmiş Payload

`RequestObject.Payload` alanı serialize edilmiş bir JSON string'tir; ikinci bir parse sonrasında aşağıdaki yapıya ulaşılır:

```json
[
  {
    "ChangeType": "ManualDisabled",
    "Reason": "Sigorta şirketi bakım bildirimi.",
    "StatusDate": "2026-08-10T11:05:00+03:00",
    "Values": [
      {
        "InsuranceCompanyId": 12,
        "InsuranceCompanyName": "Örnek Sigorta",
        "Operations": [
          {
            "ProductId": 27,
            "ProductName": "Kasko",
            "ServiceOperationId": 118,
            "ServiceOperationName": "Teklif",
            "ServiceName": "ProposalService",
            "OutsourceProcessId": null,
            "OutsourceProcessName": null
          }
        ]
      }
    ]
  }
]
```

### Değişim Grubu

Dizinin her elemanı bir değişim grubudur:

| Alan         | Tip               | Açıklama                                                                                                                                                                                          |
| ------------ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ChangeType` | string            | Grubun türü. Statü değişikliklerinde operasyonların **yeni statüsü**, katalog değişikliklerinde `added` / `removed`. Aynı tip bir dizide iki kez gelmez. Değerler için aşağıdaki tabloya bakınız. |
| `Reason`     | string            | Değişikliğin gerekçesi. Statü değişikliğinde işlemi yapanın girdiği gerekçe, katalog değişikliğinde sabit açıklama.                                                                               |
| `StatusDate` | string (ISO 8601) | Değişiklik zamanı.                                                                                                                                                                                |
| `Values`     | array             | Grubun etkilediği operasyonların sigorta şirketi bazında gruplanmış hali. Statü değişikliğinde tek eleman, katalog değişikliğinde etkilenen her şirket için bir eleman.                           |

### `ChangeType` Değerleri

| Değer            | Anlamı                                                                                               |
| ---------------- | ---------------------------------------------------------------------------------------------------- |
| `Active`         | Operasyon yeniden kullanıma açıldı.                                                                  |
| `AutoDisabled`   | Otomatik değerlendirme sigorta şirketi servisinde genel bir sorun tespit etti.                       |
| `ManualDisabled` | Operasyon bir yönetici tarafından elle kapatıldı.                                                    |
| `added`          | Operasyon(lar) katalog tanımına eklendi; artık kullanıma açık servisler listesinde yer alıyor.       |
| `removed`        | Operasyon(lar) katalog tanımından kaldırıldı; artık kullanıma açık servisler listesinde yer almıyor. |

> `AutoDisabled` ve `ManualDisabled` **bilgilendirme amaçlıdır**: InsurGateway bu operasyonlara gelen istekleri engellemez. İsteği göndermeme ya da alternatife yönlendirme kararı platforma aittir.

### `Values` Elemanı

| Alan                   | Tip    | Açıklama                                  |
| ---------------------- | ------ | ----------------------------------------- |
| `InsuranceCompanyId`   | int    | Etkilenen operasyonların sigorta şirketi. |
| `InsuranceCompanyName` | string | Sigorta şirketinin adı.                   |
| `Operations`           | array  | Şirketin etkilenen servis operasyonları.  |

### `Operations` Elemanı

| Alan                   | Tip         | Açıklama                                                         |
| ---------------------- | ----------- | ---------------------------------------------------------------- |
| `ProductId`            | int \| null | Operasyonun ürünü; ürün bağımsız operasyonlarda `null`.          |
| `ProductName`          | string      | Ürün adı; ürün bağımsız operasyonlarda `"Tüm Ürünler"`.          |
| `ServiceOperationId`   | int         | Servis operasyonu kimliği.                                       |
| `ServiceOperationName` | string      | Servis operasyonu adı.                                           |
| `ServiceName`          | string      | Operasyonun ait olduğu servis adı.                               |
| `OutsourceProcessId`   | int \| null | Outsource süreç kimliği; yalnızca outsource operasyonlarda dolu. |
| `OutsourceProcessName` | string      | Outsource süreç adı; yalnızca outsource operasyonlarda dolu.     |

Bir kaydın kimliği **(InsuranceCompanyId, ProductId, ServiceOperationId, OutsourceProcessId)** dörtlüsüdür; `InsuranceCompanyId` operasyonu içeren `Values` elemanından, kalan üçü operasyonun kendisinden okunur. Uygulanacak işlem ise o elemanı içeren değişim grubunun `ChangeType`'ından gelir. Platform tarafındaki eşleştirme bu dörtlü üzerinden yapılmalıdır.

---

## Örnek: Katalog Değişikliği

Katalog senkronu aynı koşuda hem ekleme hem kaldırma ürettiğinde ve birden fazla şirkete dokunduğunda da tek bildirim gönderilir; değişiklikler grup, şirketler `Values` listesi olarak ayrışır:

```json
[
  {
    "ChangeType": "added",
    "Reason": "Katalog tanımına eklendi.",
    "StatusDate": "2026-08-10T03:15:00+03:00",
    "Values": [
      {
        "InsuranceCompanyId": 12,
        "InsuranceCompanyName": "Örnek Sigorta",
        "Operations": [
          {
            "ProductId": null,
            "ProductName": "Tüm Ürünler",
            "ServiceOperationId": 305,
            "ServiceOperationName": "PolicyDetail",
            "ServiceName": "PolicyService",
            "OutsourceProcessId": null,
            "OutsourceProcessName": null
          },
          {
            "ProductId": 31,
            "ProductName": "Trafik",
            "ServiceOperationId": 118,
            "ServiceOperationName": "Teklif",
            "ServiceName": "ProposalService",
            "OutsourceProcessId": 4,
            "OutsourceProcessName": "Teklif Yenileme"
          }
        ]
      },
      {
        "InsuranceCompanyId": 35,
        "InsuranceCompanyName": "Diğer Sigorta",
        "Operations": [
          {
            "ProductId": 31,
            "ProductName": "Trafik",
            "ServiceOperationId": 118,
            "ServiceOperationName": "Teklif",
            "ServiceName": "ProposalService",
            "OutsourceProcessId": null,
            "OutsourceProcessName": null
          }
        ]
      }
    ]
  },
  {
    "ChangeType": "removed",
    "Reason": "Katalog tanımından kaldırıldı.",
    "StatusDate": "2026-08-10T03:15:00+03:00",
    "Values": [
      {
        "InsuranceCompanyId": 12,
        "InsuranceCompanyName": "Örnek Sigorta",
        "Operations": [
          {
            "ProductId": 27,
            "ProductName": "Kasko",
            "ServiceOperationId": 118,
            "ServiceOperationName": "Teklif",
            "ServiceName": "ProposalService",
            "OutsourceProcessId": null,
            "OutsourceProcessName": null
          }
        ]
      }
    ]
  }
]
```

---

## Güncel Durumun Okunması

Bildirim, değişikliği duyurur; tam listeyi taşımaz. Platform güncel statülerin tamamını Kullanıma Açık Servisler API'sinden okuyabilir:

1. `GET /api/ServiceAvailabilities/agents/{agentId}` — yalnızca acentenin kullanabileceği kayıtları döner; kapsam acentenin ürün yetkisinden çözülür.
2. `GET /api/ServiceAvailabilities/companies/{insuranceCompanyId}` — bildirimdeki şirketin kayıtlarını döner.
3. `GET /api/ServiceAvailabilities` — tüm kataloğu döner.

Listeleme uçlarının tamamı aynı sayfalama zarfını döner (`Items`, `TotalCount`, `Page`, `Size`, `TotalPage`, `HasNextPage`, `HasPreviousPage`) ve sayfa başına en fazla **200** kayıt verir.

Bildirim kaçırılsa bile statü kaybolmaz: bir sonraki bildirimde ya da periyodik okuma turunda güncel durum elde edilir. Uç noktaların ayrıntıları için API referansındaki **Service Availability** bölümüne bakınız.

---

## Beklenen Cevap

Platform, bildirimi aldığında **HTTP 2xx** dönmelidir. InsurGateway başarıyı **yalnızca HTTP durum koduna** göre belirler; cevap gövdesi değerlendirilmez (gövde boş olabilir).

**Başarı:**

```http
HTTP/1.1 200 OK
```

**Hata:**

`2xx` dışı herhangi bir HTTP kodu (örn. `500`) hata kabul edilir.

```http
HTTP/1.1 500 Internal Server Error
```

> Bildirim `ReferanceNo` üzerinden **idempotent** işlenmelidir; aynı `ReferanceNo` ile yeniden gelen bir bildirim tekrar uygulanmamalıdır.

---

## Retry

InsurGateway, bildirimi **yalnızca platforma ulaşamadığında** (bağlantı hatası / timeout — yani HTTP cevabı hiç alınamadığında) yeniden gönderir. Platformdan dönen `2xx` **dışı bir HTTP cevabı retry üretmez**; hata loglanır ve bildirim düşülür.

| Parametre                       | Değer                                               |
| ------------------------------- | --------------------------------------------------- |
| Retry koşulu                    | Yalnızca transport hatası (HTTP cevabı alınamaması) |
| `2xx` dışı HTTP cevabı          | Retry YOK — loglanır ve düşülür                     |
| Maksimum retry (orijinal hariç) | **10**                                              |
| Toplam maksimum deneme          | **11**                                              |
| Bekleme süreleri                | 3 sn → 10 sn → 1 dk → 1 saat (≥4. retry)            |

Son denemede HTTP başlığında `IsLastAttemptToReDelivery=true` gönderilir.