
# API güncelle

`PATCH /v1/apis/{api_id}` · izin `apis:write`

API'yi JSON birleştirme yamasıyla günceller (RFC 7396, `application/merge-patch+json`): gönderdiğiniz alanlar değişir, göndermedikleriniz kalır. `If-Match` zorunludur. `key` ve `identifier` oluşturulduktan sonra değişmez; sistem API'si değiştirilemez. Hiçbir şeyi değiştirmeyen yama yazma yapmaz ve sürümü korur.

## İstek

| Parametre | Yer | Açıklama |
|---|---|---|
| `api_id` | yol | API kimliği. |
| `If-Match` | başlık | Son okumadaki `ETag` (zorunlu). |

Gövde: aşağıdaki yazılabilir alanlardan herhangi biri (hepsi isteğe bağlı). Bir alan `null` ile kaldırılamaz.

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `key` | string | hayır | Kararlı yapılandırma anahtarı, `^[a-z0-9_-]{1,64}$`. Değişmez. |
| `identifier` | string | hayır | Jeton kitlesi: https URL (sorgu ve parça yok) ya da `urn:<nid>:<nss>`; kanonik biçimde saklanır. Değişmez. `urn:idp:` ad alanı ayrılmıştır. |
| `name` | string | hayır | 1-128 karakter. |
| `access_token_lifetime_s` | integer | hayır | 60-86400. Varsayılan 3600 (`mcp_profile` ile 600). |
| `token_format` | string | hayır | `jwt` (varsayılan) ya da `opaque`. |
| `rbac_mode` | string | hayır | Rol ve izinlerin jetona yansıması: `claims` (varsayılan) `permissions` ve `org_permissions` ekler; `off` ikisini de eklemez (`org_roles` yine eklenir); `enforce` ikisini ekler ve verilen scope'ları kullanıcının etkin izinleriyle sınırlar. |
| `allow_offline_access` | boolean | hayır | Varsayılan `true`. |
| `require_resource_indicator` | boolean | hayır | Varsayılan `false` (`mcp_profile` ile `true`). |
| `dpop_required` | boolean | hayır | Varsayılan `false`. |
| `mcp_profile` | boolean | hayır | https `identifier` ve `require_resource_indicator: true` ister. |
| `first_party_access` | string | hayır | `all` (varsayılan) ya da `granted_only`. |
| `introspection_applications` | dizi | hayır | Bu API'nin jetonlarını introspection ile sorgulayabilen uygulamalar (`app_…`), en çok 50, tekrarsız. Yalnız aynı ortamın `web` ve `m2m` uygulamaları. Liste bütünüyle değiştirilir; `[]` listeyi boşaltır, `null` kabul edilmez. |

### Introspection uygulamaları

Introspection ucu (`POST <issuer>/oauth2/introspect`, RFC 7662) bir erişim jetonu için `active: true` yanıtını yalnız iki çağırana verir: jetonun verildiği uygulamaya ya da jetonun `aud` değerindeki API'nin `introspection_applications` listesindeki uygulamaya. Diğer her çağıran `active: false` alır; böylece API'ler birbirinin jetonunu sorgulayamaz. Listeye yalnız aynı ortamın gizli uygulamaları (`web`, `m2m`) eklenebilir; liste küme olarak saklanır ve kimlik sırasıyla döner. Askıya alınmış uygulama listede kalır ama sorgulayamaz. Sistem API'sinin listesi yazılamaz.

## Yanıt

`200 OK`, yeni `ETag` ile:

```json
{
  "id": "api_01h455vb4pex5vsknk084sn02q",
  "key": "orders",
  "identifier": "https://api.example.com/orders",
  "name": "Orders API",
  "is_system": false,
  "access_token_lifetime_s": 3600,
  "token_format": "jwt",
  "rbac_mode": "off",
  "allow_offline_access": true,
  "require_resource_indicator": false,
  "dpop_required": false,
  "mcp_profile": false,
  "first_party_access": "all",
  "introspection_applications": ["app_01h455vb4pex5vsknk084sn02r"],
  "created_at": "2026-10-05T12:00:00Z",
  "updated_at": "2026-10-05T12:00:00Z"
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Yama salt okunur ya da bilinmeyen bir alan içeriyor. |
| 404 | `not_found` | Bu ortamda böyle bir API yok. |
| 409 | `conflict` | API sistem API'si. |
| 412 | `precondition_failed` | `If-Match` güncel sürümle eşleşmiyor. |
| 415 | `unsupported_media_type` | İçerik türü `application/merge-patch+json` değil. |
| 422 | `validation_failed` | Bir değer geçersiz, bir alan `null` yapılmış ya da `key` / `identifier` değiştirilmiş. |
| 422 | `validation_failed` | `introspection_applications` öğesi bu ortamda yok (`unknown_application`), gizli değil (`not_confidential`), tekrarlı (`duplicate`) ya da `app_…` biçiminde değil (`invalid_value`); işaretçi istekteki indeksi gösterir. |
| 428 | `precondition_required` | `If-Match` yok. |

## Örnek

```bash
curl -X PATCH https://api.eu.keenauth.com/v1/apis/api_01h455vb4pex5vsknk084sn02q \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -H 'If-Match: "1"' \
  -d '{"access_token_lifetime_s":900}'
```
