
# İzin oluşturun

`POST /v1/permissions` · izin `apis:write`

Bir API'ye izin (OAuth kapsamı) ekler; isteğe bağlı olarak onay ekranında gösterilen metinleri de ekleyebilirsiniz. `Idempotency-Key` desteklenir.

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `api_id` | string | evet | API (`api_…`). |
| `value` | string | evet | Kapsam değeri, `resource:action` (`^[a-z0-9_.-]{1,64}:[a-z0-9_.*-]{1,64}$`). API içinde benzersiz olmalı ve sonradan değiştirilemez. `idp_` öneki ayrılmıştır. |
| `display_name` | string \\| null | hayır | Onay ekranında kapsam değeri yerine gösterilen kısa ad. En fazla 128 karakter. |
| `description` | string \\| null | hayır | Onay ekranında adın altında gösterilen ayrıntı satırı. En fazla 1024 karakter. |
| `consent_text_i18n` | object \\| null | hayır | Dil etiketi → onay ekranı metni, örneğin `{"en": "Read your orders"}`. En fazla 30 dil, her metin 1-1024 karakter, toplam 16 KiB. |
| `sensitivity` | string | hayır | `normal` (varsayılan) veya `sensitive`. |

### Onay ekranı metinleri

Barındırılan onay ekranı, istenen her kapsamı şöyle gösterir: sayfa dili için `consent_text_i18n` girdisi (tam etiket, yoksa birincil alt etiketi), yoksa `display_name`, yoksa kapsam `value` değeri; `description` ayrıntı satırı olarak gösterilir. Üçü de düz metindir. Denetim karakterleri (satır sonları ve sekmeler dahil), satır ve paragraf ayırıcıları ile çift yönlü gömme, geçersiz kılma ve izole etme karakterleri (U+202A-U+202E, U+2066-U+2069) `422` ile reddedilir. Baştaki ve sondaki boşluklar kırpılır; kırpıldıktan sonra boş kalan metin `null` olarak saklanır. HTML yorumlanmaz: onay ekranı bunu kaçış karakterleriyle gösterir.

## Yanıt

`201 Created`

```json
{
  "id": "perm_01h455vb4pex5vsknk084sn02s",
  "api_id": "api_01h455vb4pex5vsknk084sn02q",
  "value": "read:orders",
  "display_name": "Read orders",
  "description": "See your past orders and their status",
  "consent_text_i18n": {
    "en": "Read your orders",
    "tr": "Siparişlerinizi okuyun"
  },
  "sensitivity": "normal"
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Gövde bilinmeyen bir alan içeriyor. |
| 403 | `insufficient_permissions` | Kimlik bilgisinde `apis:write` yok. |
| 403 | `quota_exceeded` | API'nin zaten 1.000 izni var. |
| 404 | `not_found` | Bu ortamda böyle bir API yok. |
| 409 | `conflict` | Değer bu API'de zaten var ya da API sistem API'si. |
| 422 | `validation_failed` | Bir alan eksik ya da geçersiz, ya da bir metin düz metin değil (`errors[].pointer` alanı belirtir, örneğin `/consent_text_i18n`). |

## Örnek

```bash
curl -X POST https://api.eu.keenauth.com/v1/permissions \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1d2c1e-perm-create" \
  -d '{"api_id":"api_01h455vb4pex5vsknk084sn02q","value":"read:orders","display_name":"Read orders","consent_text_i18n":{"en":"Read your orders"}}'
```

CLI ile dil eşlemesini `--data` ile iletin:

```bash
echo '{"consent_text_i18n":{"en":"Read your orders"}}' | keenauth permissions create \
  --api-id api_01h455vb4pex5vsknk084sn02q --value read:orders --display-name "Read orders" --data -
```
