# İzin kaydetme

> İzinleri İYS'ye kaydeder.

- **İstek:** `POST https://ext-api.netgsm.com.tr/iys/v1/consents`
- **Canlı ortam:** `https://ext-api.netgsm.com.tr/iys/v1`
- **Kimlik doğrulama:** `Authorization: Bearer <token>`
- **HTML sayfası:** https://api-docs.netgsm.com.tr/iys/save-consents/
- **OpenAPI tanımı:** https://api-docs.netgsm.com.tr/openapi/iys-v1.yaml (operationId: `saveConsents`)

## Açıklama

İzinleri İYS'ye kaydeder. Bir istekte en fazla 500 izin gönderebilirsiniz.

İYS bazı kayıtları reddederse işlem yine başarılı sayılır: kabul edilen kayıtlar işlenir,
reddedilenler yanıttaki `data.erroritem` altında, istekteki sıralarıyla (`index`) döner.

## İstek

### Gövde (`application/json`, zorunlu)

- `brandCode` (integer, zorunlu, en az 1, en fazla 2147483647): İYS marka kodu. Örnek: `123456`.
- `path` (string, null olabilir, isteğe bağlı): Gönderilmezse `SMSAPI` kabul edilir. Değerler: `SANTRAL`, `SMSAPI`, `WEBPORTAL`. Örnek: `SMSAPI`.
- `refId` (string, null olabilir, isteğe bağlı, en az uzunluk 1, en fazla uzunluk 255): Örnek: `40e6215d-b5c6-4896-987c-f30f3678f608`.
- `permissions` (array<object>, zorunlu, en az kayıt 1, en fazla kayıt 500)
- `permissions[].recipient` (string, zorunlu, en fazla uzunluk 255): Telefon numarası (`+90XXXXXXXXXX`) ya da e-posta adresi. Örnek: `+905554443322`.
- `permissions[].recipientType` (string, zorunlu): `BIREYSEL` bireysel, `TACIR` tacir alıcı. Değerler: `BIREYSEL`, `TACIR`. Örnek: `BIREYSEL`.
- `permissions[].type` (string, zorunlu): `ARAMA` sesli arama, `MESAJ` SMS, `EPOSTA` e-posta izni. Değerler: `ARAMA`, `MESAJ`, `EPOSTA`. Örnek: `MESAJ`.
- `permissions[].source` (string, zorunlu): İznin alındığı kaynak. Değerler: `HS_FIZIKSEL_ORTAM`, `HS_ISLAK_IMZA`, `HS_WEB`, `HS_CAGRI_MERKEZI`, `HS_SOSYAL_MEDYA`, `HS_EPOSTA`, `HS_MESAJ`, `HS_MOBIL`, `HS_EORTAM`, `HS_ETKINLIK`, `HS_2015`, `HS_ATM`, `HS_KARAR`. Örnek: `HS_WEB`.
- `permissions[].status` (string, zorunlu): `ONAY` izin verildi, `RET` izin reddedildi. Değerler: `ONAY`, `RET`. Örnek: `ONAY`.
- `permissions[].consentDate` (string, zorunlu): İznin alındığı tarih, `YYYY-MM-DD HH:mm:ss`. Örnek: `2026-02-20 16:46:00`.
- `permissions[].retailerCode` (integer, null olabilir, isteğe bağlı, en az 0): Örnek: `0`.
- `permissions[].retailerAccess` (array<integer>, null olabilir, isteğe bağlı)

Örnek gövde:

```json
{
  "brandCode": 123456,
  "path": "SMSAPI",
  "refId": "40e6215d-b5c6-4896-987c-f30f3678f608",
  "permissions": [
    {
      "recipient": "+905554443322",
      "recipientType": "BIREYSEL",
      "type": "ARAMA",
      "source": "HS_FIZIKSEL_ORTAM",
      "status": "ONAY",
      "consentDate": "2026-02-20 16:46:00",
      "retailerCode": 0,
      "retailerAccess": [
        0,
        1
      ]
    }
  ]
}
```

## Örnek istek

```bash
curl -X POST 'https://ext-api.netgsm.com.tr/iys/v1/consents' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "brandCode": 123456,
  "path": "SMSAPI",
  "refId": "40e6215d-b5c6-4896-987c-f30f3678f608",
  "permissions": [
    {
      "recipient": "+905554443322",
      "recipientType": "BIREYSEL",
      "type": "ARAMA",
      "source": "HS_FIZIKSEL_ORTAM",
      "status": "ONAY",
      "consentDate": "2026-02-20 16:46:00",
      "retailerCode": 0,
      "retailerAccess": [
        0,
        1
      ]
    }
  ]
}'
```

## Yanıtlar

### 200 — İzinler kaydedildi.

Gövde (`application/json`):

- `success` (boolean, isteğe bağlı): Örnek: `true`.
- `errorCode` (integer, isteğe bağlı): Örnek: `0`.
- `message` (string, isteğe bağlı): Örnek: `success`.
- `data` (object, isteğe bağlı)
- `data.uid` (string, isteğe bağlı): Örnek: `ee5c7e61-3940-432a-af30-13b0c9944371`.
- `data.erroritem` (array<object>, isteğe bağlı): İYS'nin reddettiği kayıtlar. Yalnızca reddedilen kayıt varsa bulunur.
- `data.erroritem[].index` (integer, isteğe bağlı): Kaydın `permissions` içindeki sırası (0'dan başlar). Örnek: `1`.
- `data.erroritem[].field` (string, isteğe bağlı): Örnek: `recipient`.
- `data.erroritem[].message` (string, isteğe bağlı): Örnek: `Geçersiz telefon numarası formatı`.

Örnek: Tüm kayıtlar kabul edildi

```json
{
  "success": true,
  "errorCode": 0,
  "message": "success",
  "data": {
    "uid": "ee5c7e61-3940-432a-af30-13b0c9944371"
  }
}
```

Örnek: Bazı kayıtlar İYS tarafından reddedildi

```json
{
  "success": true,
  "errorCode": 0,
  "message": "success",
  "data": {
    "uid": "ee5c7e61-3940-432a-af30-13b0c9944371",
    "erroritem": [
      {
        "index": 1,
        "field": "recipient",
        "message": "Geçersiz telefon numarası formatı"
      }
    ]
  }
}
```

### 400 — Hatalı istek.

Gövde (`application/json`):

- `success` (boolean, isteğe bağlı): Örnek: `false`.
- `errorCode` (integer, isteğe bağlı): Hata kodu (bkz. Hata kodları). Örnek: `120`.
- `message` (string, isteğe bağlı): Örnek: `Bad request`.
- `data` (array<any> | object, isteğe bağlı): Hata ayrıntıları. Çoğu hatada boş dizidir; doğrulama hatasında `errors` nesnesini taşır.
- `data` oneOf → **seçenek 1**
- `data` oneOf → **seçenek 2**

Örnek:

```json
{
  "success": false,
  "errorCode": 120,
  "message": "Bad request",
  "data": []
}
```

### 401 — Token yok, geçersiz ya da süresi dolmuş.

Gövde (`application/json`): alanlar 400 yanıtıyla aynı.

Örnek: Token'ın süresi dolmuş

```json
{
  "success": false,
  "errorCode": 53,
  "message": "Token has expired",
  "data": []
}
```

Örnek: Token bulunamadı

```json
{
  "success": false,
  "errorCode": 51,
  "message": "Token not found",
  "data": []
}
```

### 403 — Yetkisiz erişim ya da hesapta İYS hizmeti aktif değil.

Gövde (`application/json`): alanlar 400 yanıtıyla aynı.

Örnek:

```json
{
  "success": false,
  "errorCode": 60,
  "message": "Unauthorized access",
  "data": []
}
```

### 422 — İstekteki bir alan kurallara uymuyor.

Gövde (`application/json`): alanlar 400 yanıtıyla aynı.

Örnek:

```json
{
  "success": false,
  "errorCode": 70,
  "message": "Validation failed",
  "data": {
    "errors": {
      "brandCode": "The brand code field is required."
    }
  }
}
```

### 424 — İYS'den geçerli bir yanıt alınamadı.

Gövde (`application/json`): alanlar 400 yanıtıyla aynı.

Örnek:

```json
{
  "success": false,
  "errorCode": 112,
  "message": "Api Error",
  "data": []
}
```

### 429 — Çok fazla istek gönderildi.

Gövde (`application/json`): alanlar 400 yanıtıyla aynı.

Örnek:

```json
{
  "success": false,
  "errorCode": 150,
  "message": "Too many requests.",
  "data": []
}
```

### 500 — Beklenmeyen bir hata oluştu.

Gövde (`application/json`): alanlar 400 yanıtıyla aynı.

Örnek:

```json
{
  "success": false,
  "errorCode": 110,
  "message": "Server Error",
  "data": []
}
```
