
# Passkey kaydet

`POST /fapi/v1/me/passkeys` · ortamın oturum açma ana bilgisayarından çağrılır

[`POST /fapi/v1/me/passkeys/registration-options`](./registration-options) ile başlatılan kaydı tamamlar: tarayıcının yanıtını doğrular, Passkey'i veya güvenlik anahtarını saklar ve döndürür. Kullanıcıya yeni oturum açma yöntemi hakkında bir güvenlik e-postası gönderilir; bu e-posta kapatılamaz. Kimliği doğrulanmış kullanıcının `__Host-idp_session` çerezi gereklidir; çerez yoksa, süresi dolmuşsa veya iptal edilmişse `401 unauthenticated` döner. Farklı bir kaynaktaki birinci taraf uygulama bunun yerine ön uç API erişim belirtecini gönderebilir (DPoP kanıtıyla birlikte `Authorization: DPoP <token>`; bkz. [Ön uç API erişim belirteci](/docs/api/fapi/front-api-token)).

Oturum kuralları başlatma çağrısındakilerle aynıdır: son 10 dakika içinde doğrulanmış olmalı ve kullanıcının ikinci bir faktörü varsa bu faktörle açılmış olmalıdır.

## İstek

Başlıklar:

| Başlık | Zorunlu | Açıklama |
| --- | --- | --- |
| `Idp-Client` | evet | SDK tanımlayıcısı. |
| `Origin` | evet | Tam olarak `https://<oturum açma ana bilgisayarı>` olmalıdır. |
| `Content-Type` | evet | `application/json`. |

Gövde:

| Alan | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `ceremony_id` | string | evet | Başlatma çağrısının `ceremony_id` değeri. |
| `credential` | object | evet | `navigator.credentials.create` sonucu JSON olarak (`PublicKeyCredential.toJSON()`), en fazla 16 KiB. |

## Yanıt

`201 Created`, yeni kimlik doğrulayıcı:

```json
{
  "id": "cred_01j9zzzzzzzzzzzzzzzzzzzzzz",
  "type": "passkey",
  "label": "iCloud Keychain",
  "status": "active",
  "synced": true,
  "created_at": "2026-10-12T09:00:00Z",
  "last_used_at": null
}
```

## Hatalar

Reddedilen bir kayıt başarısız deneme olarak sayılmaz; yeni bir kayıtla yeniden başlatın.

| Durum | Kod | Ne zaman |
| --- | --- | --- |
| 400 | `malformed_request` | Gövde geçerli bir JSON değil. |
| 400 | `unknown_field` | Gövdede `ceremony_id` ve `credential` dışında bir alan var. |
| 401 | `unauthenticated` | Geçerli bir oturum çerezi yok. |
| 401 | `step_up_required` | Oturum çok eski veya ikinci bir faktör gerekiyor; `WWW-Authenticate` başlığındaki değerlerle yeniden doğrulayın. |
| 403 | `origin_not_allowed` | `Origin` eksik veya yanlış. |
| 409 | `credential_already_registered` | Bu kimlik doğrulayıcı ortamda zaten kayıtlı. |
| 409 | `credential_limit_reached` | Kullanıcının zaten izin verilen en fazla sayıda Passkey'i ve güvenlik anahtarı var. |
| 413 | `payload_too_large` | Gövde çok büyük. |
| 415 | `unsupported_media_type` | `Content-Type` `application/json` değil. |
| 422 | `validation_failed` | `/ceremony_id`: kayıt bilinmiyor, süresi dolmuş, daha önce kullanılmış veya başka bir oturuma ait. `/credential`: yanıt eksik veya doğrulanamıyor. |
| 422 | `device_bound_passkey_required` | Ortam yalnızca tek bir cihazda kalan Passkey'lere izin veriyor. |
| 422 | `aaguid_not_allowed` | Ortam bu kimlik doğrulayıcı modeline izin vermiyor. |
| 422 | `attestation_untrusted` | Ortam güvenilir bir attestation istiyor ve bu güvenilir değil. |

## Örnek

```bash
curl -X POST https://example.keenauth.app/fapi/v1/me/passkeys \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -H "Content-Type: application/json" \
  -b cookies.txt \
  -d '{"ceremony_id": "CQAAAAAAAAAAAAAAAAAAAA", "credential": {"id": "…", "rawId": "…", "type": "public-key", "response": {"clientDataJSON": "…", "attestationObject": "…"}}}'
```

## Kişisel veriler

Bu uç nokta kişisel veri içerir: kimlik bilgileri. [KeenAuth API'lerinde kişisel veriler](/docs/policies/personal-data) bölümünde neyin saklandığı, ne kadar süreyle tutulduğu ve nasıl silindiği açıklanmaktadır. Hiçbir alanda özel nitelikli kişisel verileri (sağlık, biyometrik veriler, din, siyasi görüşler, cinsel yönelim) göndermeyin.
