
# Uygulama oluşturun

`POST /v1/applications` · izin `applications:write`

Çağıran anahtarın ortamında bir uygulama (bir OAuth/OIDC istemcisi) oluşturur. `key`, `name`, `app_type` ve `party` zorunludur; diğer her alan uygulama türünden türetilen güvenli bir varsayılan değer alır. Yanıt, güncelleme veya silme sırasında `If-Match` olarak göndermeniz gereken bir `ETag` içerir. Bu işlem bir istemci gizli anahtarı oluşturmaz; gizli anahtarlar ve anahtarlar uygulama kimlik bilgisi uç noktaları üzerinden yönetilir.

## İstek

**Gövde** (`application/json`). Tanımsız alanlar reddedilir. Yalnızca `key`, `name`, `app_type` ve `party` zorunludur.

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `key` | string | evet | Kararlı yapılandırma anahtarı, `^[a-z0-9_-]{1,64}$`, ortam başına benzersiz. Oluşturma sırasında zorunludur; sonradan değiştirilemez. |
| `name` | string | evet | Görünen ad, 1-100 karakter. |
| `app_type` | string | evet | `web`, `spa`, `native`, `m2m`, `device` veya `management`. Oluşturma sırasında zorunludur; sonradan değiştirilemez. |
| `party` | string | evet | `first_party` veya `third_party`. Oluşturma sırasında zorunludur; yalnızca `first_party` değerinden `third_party` değerine değiştirilebilir. |
| `owner_org_id` | string veya null | hayır | Sahip kuruluşun `org_…` kimliği; yalnızca `m2m` uygulamalar için; değiştirilemez. |
| `status` | string | hayır | `active` veya `suspended`. Askıya alınmış bir uygulama yeni belirteçler alamaz. |
| `allowed_web_origins` | string[] | hayır | İzin verilen CORS kökenleri (`https://host[:port]`), en fazla 20, joker karakter yok. |
| `organization_usage` | string | hayır | `deny`, `allow` veya `require`. `organization` yetkilendirme parametresini yönetir (bir `org_…` kimliği veya kuruluşun slug'ı): `deny` bunu reddeder, `allow` isteğe bağlı kılar, `require` zorunlu kılar. Belirteç, `org_id` değerini yalnızca kullanıcının üyeliği doğrulandıktan sonra taşır. |
| `org_access_mode` | string | hayır | Kuruluş girişi erişimi: `all_organizations` (varsayılan; her kuruluşun her üyesi), `enabled_organizations` (yalnızca uygulamanın etkin olduğu kuruluşlar) veya `assigned_only` (ayrıca yalnızca atanmış üyelikler veya dizin grupları). Bkz. [Kuruluş uygulamaları](../organization-applications/get.md). |
| `registration_mode` | string veya null | hayır | `open`, `invite_only` veya `closed`; boş bırakılırsa ortam ayarı devralınır. |
| `registration_source` | string | hayır | Oluşturmada `dashboard` veya `management_api` (varsayılan `management_api`); değiştirilemez. Yanıtlar ayrıca `dcr` veya `cimd` gösterebilir. |
| `verification_status` | string | hayır | `verified` veya `unverified`. |
| `security_profile` | string | hayır | `baseline` (bugün yazılabilir tek profil). |
| `token_endpoint_auth_method` | string | hayır | `private_key_jwt`, `client_secret_basic`, `client_secret_post` veya `none`; `app_type` için izin verilmiş olmalıdır. |
| `grant_types` | string[] | hayır | İzin verilen yetki türleri; `app_type`'ın izin verdiklerinin bir alt kümesi. |
| `default_api_id` | string veya null | hayır | İstekte `resource` yoksa kullanılan API'nin `api_…` kimliği. |
| `require_par` | boolean | hayır | Gönderilmiş yetkilendirme isteklerini zorunlu kılar. |
| `require_state` | boolean | hayır | `state` değerini zorunlu kılar. |
| `require_nonce` | boolean | hayır | `nonce` değerini zorunlu kılar. |
| `pkce_required` | boolean | hayır | PKCE'yi zorunlu kılar; yalnızca gizli tutulan bir web uygulaması için devre dışı bırakılabilir. PKCE olmadan `nonce`, yetkilendirme kodu enjeksiyonuna karşı tek savunmadır; bu nedenle geliştirme ortamları dışında `require_nonce` açık kalmalıdır (aksi halde `/require_nonce` üzerinde `validation_failed`). |
| `skip_consent` | boolean | hayır | Onay ekranını atlar; yalnızca birinci taraf uygulamalar. |
| `token_binding_policy` | string | hayır | `none` veya `dpop_required`. |
| `login_host` | string veya null | hayır | Ortamın giriş ana makinelerinden biri (küçük harfli DNS adı). |
| `default_max_age_s` | integer veya null | hayır | Saniye cinsinden varsayılan `max_age`. |
| `min_acr` | string veya null | hayır | Asgari kimlik doğrulama güvencesi: `urn:idp:acr:1fa`, `urn:idp:acr:mfa` veya `urn:idp:acr:phr`. |
| `access_token_lifetime_s` | integer veya null | hayır | Erişim belirteci ömrü, 60-86400 saniye. |
| `refresh_idle_s` | integer veya null | hayır | Saniye cinsinden yenileme belirteci boşta kalma ömrü; `refresh_absolute_s` değerini aşamaz. |
| `refresh_absolute_s` | integer veya null | hayır | Saniye cinsinden yenileme belirteci mutlak ömrü. |
| `refresh_reuse_interval_s` | integer | hayır | Yenileme belirteci yeniden kullanım penceresi, 0-30 saniye (varsayılan 5). |
| `backchannel_logout_uri` | string veya null | hayır | Arka kanal oturum kapatma URI'si (`https`). |
| `frontchannel_logout_uri` | string veya null | hayır | Ön kanal oturum kapatma URI'si (`https`). |
| `frontchannel_logout_session_required` | boolean | hayır | Ön kanal oturum kapatma URI'sine `iss` ve `sid` ekler. Ortamın ön kanal oturum kapatma ayarı kapalıyken bunu `true` yapmak 422 döndürür. Varsayılan `false`. |
| `initiate_login_uri` | string | hayır | OIDC giriş başlatma URI'si (OpenID Connect Core 1.0 §4): IdP tarafından başlatılan bir SAML girişinden sonra tarayıcı buraya `iss` ile yönlendirilir ve uygulama kendi yetkilendirme kodu akışını `state` ve PKCE ile başlatır. Küçük harfli DNS ana makinesine sahip mutlak `https` URL, parça veya kullanıcı bilgisi yok, en fazla 2048 bayt; `m2m` ve `management` uygulamalar için izin verilmez. Yalnızca bu URI'ye sahip bir uygulama, IdP tarafından başlatılan bir hedef olabilir. |
| `id_token_org_claims` | boolean | hayır | `true` ise (varsayılan), kuruluş girişinin kimlik belirteci `org_id`, `org_slug` ve `org_roles` taşır; `false` ise kimlik belirteci kuruluş talepleri taşımaz. Erişim belirteçleri etkilenmez ve kimlik belirteçleri asla izin taşımaz. |
| `policy_uri` | string veya null | hayır | Gizlilik politikası URI'si (`https`), onay ekranında gösterilir. |
| `tos_uri` | string veya null | hayır | Hizmet koşulları URI'si (`https`). |
| `client_uri` | string veya null | hayır | Uygulama ana sayfası URI'si (`https`). |
| `jwks` | object veya null | hayır | Satır içi JWK Kümesi (`{"keys":[…]}`): 1-5 genel anahtar, en fazla 16 KiB; özel anahtar üyeleri reddedilir. `jwks_uri` ile birlikte kullanılamaz. |
| `jwks_uri` | string veya null | hayır | Uzak JWK Kümesi URI'si (`https`); `jwks` ile birlikte kullanılamaz. |
| `software_id` | string veya null | hayır | Yalnızca DCR uygulamaları. |
| `software_version` | string veya null | hayır | Yalnızca DCR uygulamaları. |
| `m2m_token_lifetime_s` | integer veya null | hayır | `m2m` uygulamalar için belirteç ömrü, 60-86400 saniye. |
| `redirect_uris` | string[] | hayır | İzin verilen yönlendirme URI'leri, en fazla 50; `m2m` ve `management` için boş olmalıdır. |
| `post_logout_redirect_uris` | string[] | hayır | İzin verilen oturum kapatma sonrası yönlendirme URI'leri, en fazla 50. |
| `connection_ids` | string[] | hayır | Uygulamada etkin bağlantılar (`conn_…`), sıralı; sıra düğme sırasıdır. En fazla 100. |
| `allowed_first_factors` | string[] | hayır | Uygulamada izin verilen birincil faktörler: `password`, `passkey`, `email_otp`, `magic_link`, `sms_otp`, `social`, `enterprise` değerlerinden; yinelenen yok; bu sırayla döndürülür. Boş liste (varsayılan) uygulamanın kısıtlama eklemediği anlamına gelir. Küme, ortamın `allowed_first_factors` değeriyle kesiştirilir; geriye yöntem kalmazsa `422 policy_conflict`. |
| `allowed_response_modes` | string[] | hayır | Uygulamanın yetkilendirme ve gönderilmiş yetkilendirme isteklerinde kullanabileceği `response_mode` değerleri: `query`, `form_post` (biri veya ikisi, yinelenen yok); bu sırayla döndürülür. Varsayılan `["query"]`: yetkilendirme yanıtını form post ile alan bir uygulama `form_post` değerini açıkça ekler. `response_mode` değeri listede olmayan bir yetkilendirme isteği reddedilir; `response_mode` içermeyen istek `query` kullanır. Boş liste 422 döndürür. JARM modları (`jwt`, `query.jwt`, `fragment.jwt`, `form_post.jwt`) henüz desteklenmez. Dinamik istemci kaydı veya istemci kimliği meta veri belgesi üzerinden kaydedilen uygulamalar `["query"]` alır. |

## Yanıt

`ETag` üstbilgisi ile birlikte uygulamayla `201 Created`.

```json
{
  "id": "app_6f8d0cjgbmf0gtn2rg6pscp3cg",
  "client_id": "app_6f8d0cjgbmf0gtn2rg6pscp3cg",
  "version": 1,
  "created_at": "2026-10-05T10:00:01Z",
  "updated_at": "2026-10-05T10:00:01Z",
  "key": "portal",
  "name": "Portal",
  "app_type": "web",
  "party": "first_party",
  "status": "active",
  "redirect_uris": ["https://portal.example.com/cb"],
  "...": "all other fields from the field reference"
}
```

## Hatalar

| HTTP | `code` | Ne zaman |
|---|---|---|
| 401 | `unauthenticated` | Anahtar eksik, geçersiz veya iptal edilmiş. |
| 403 | `insufficient_permissions` | Anahtarın gerekli izni yok. |
| 409 | `conflict` | Bu `key` ile zaten bir uygulama var. |
| 422 | `validation_failed` | Bir alan geçersiz; `errors[].pointer` bunu belirtir (örneğin `/redirect_uris/0`). |
| 422 | `policy_conflict` | `allowed_first_factors` içinde ortamın birincil faktör kümesiyle ortak bir yöntem yok. |
| 400 | `unknown_field` | Gövdede şemanın parçası olmayan bir alan var. |
| 403 | `quota_exceeded` | Uygulamalar için plan sınırına ulaşıldı. |

## Örnek

```bash
curl -X POST https://api.eu.keenauth.com/v1/applications \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"portal","name":"Portal","app_type":"web","party":"first_party","redirect_uris":["https://portal.example.com/cb"]}'
```

## Yanıt alanları

`id` ve `client_id` uygulama kimliğidir (`app_…`); `version` ayrıca `ETag` olarak döndürülür; `created_at`, `updated_at`, `last_token_issued_at` ve `last_token_asn` salt okunurdur. Yukarıdaki yazılabilir her alan döndürülür. İstemci gizli anahtarları bu kaynağın hiçbir zaman parçası değildir.
