# password.es API'si artık yanıt veriyor: nasıl kullanılır

> Anahtarsız ve kayıtsız tek bir çağrı; şifreleri ve sitede gördüğünüz sayıların aynısını döndürüyor: bit, kırılma süresi ve seviye. Henüz yapmadıkları ve onu çağırmanın neden her zaman iyi bir fikir olmadığı dahil.

2026-08-31 · David Carrero · password.es
Original: https://password.es/tr/blog/sifre-uretme-api/

---

Bu blog aylardır aynı şeyi tekrarlıyor: [şifreniz tarayıcınızdan
çıkmamalı](/tr/blog/sifreni-neden-hicbir-yere-gondermiyoruz/).
[Üretici](/tr/) rastgeleliği kendi makinenizde `crypto.getRandomValues()` ile
alıyor, [şifre kontrolü](/tr/sifre-kontrol/) ise yazdığınızı hiçbir yere
göndermeden analiz ediyor.

Ve bugün, bir sunucuda şifre üreten bir API yayınlıyoruz.

**Çelişki apaçık ve onu gizlemeyeceğiz**: API'nin her yanıtı tam olarak bunu
söyleyen bir uyarı taşıyor. Ama tarayıcının olmadığı yerler var — yüz hesap
açan bir betik, geçici bir kimlik bilgisi üreten bir sunucu, birinin şifre
istediği ve uydurduğu bir asistan — ve orada alternatif «tarayıcı» değil: kötü
seçilmiş bir `random()` ya da elle yazılmış bir dizi. Bu API bunun için var.

## Çağrının tamamı

Anahtar yok, kayıt yok, başlık yok. Hepsi bu:

`curl -X POST https://api.password.es/v1/generate`

16 karakterlik bir şifre ve analizini döndürüyor. Bu paragraf yazılırken
çalıştırıldı: `x*7$9,BUy9PPvOI?`, 89 karakterlik bir alfabeden alınmış,
**103,6 bit** entropi ve 2,5 × 10¹¹ yıllık kırılma süresi. 4 üzerinden 4.
seviye.

Bu sayıların hiçbiri yeni değil. Ana sayfadaki göstergeyi çizen aynı motordan
çıkıyorlar: aynı [bit](/tr/blog/entropi-bitleri-nedir/) formülü, aynı saldırı
modeli — saniyede 10¹² deneme, çevrimdışı, hızlı hash — ve şifre kontrolüyle
aynı seviye ölçeği. Site ile API aynı şifre için farklı sayılar verseydi,
ikisinden biri yalan söylüyor olurdu.

## Ne döndürüyor, alan alan

Yanıt `passwords` içeriyor — tek bir tane isteseniz bile her zaman bir dizi — ve
`length`, `pool`, `bits`, `log10_guesses`, `crack_time_log10_seconds`,
`crack_time`, `level`, `level_scale` ve `ceiling` alanlarıyla bir `analysis`
bloğu.

Bunlardan ikisi bir paragrafı hak ediyor. **`level_scale` seviyenin nereden
geldiğini söylüyor** (bugün her zaman `"time"`); böylece site ile API arasında
gelecekte oluşacak bir ayrışma, sayıları karşılaştırarak çıkarılmak zorunda
kalmadan alanda görünür. Ve **`ceiling` rakamın kesin mi yoksa bir tavan mı
olduğunu söylüyor**: `generate` içinde her zaman `false`, çünkü şifreyi sunucu
üretti ve hangi alfabeyi kullandığını biliyor; sitedeki kontrolde bu her zaman
mümkün değil, çünkü orada şifreyi siz getiriyorsunuz.

Sonra `notice` geliyor, yani uyarı, ve planı, uygulanan dili, limitleri ve
dokümantasyona bir bağlantıyı taşıyan bir `_meta` bloğu.

## Seçenekler

Hepsi isteğe bağlı ve adları İngilizce, çünkü bir API'yi entegre eden kişi alan
adlarını olduğu gibi yazar: `length` (4–64, varsayılan 16), `count` (1–20),
`lower`, `upper`, `digits`, `symbols`, `exclude_ambiguous`, `no_repeats` ve
`lang`.

`curl -X POST https://api.password.es/v1/generate -H 'content-type: application/json' -d '{"length":20,"exclude_ambiguous":true}'`

Dokümantasyonun anlattığı ve entegre etmeden önce bilmekte fayda olan iki
ayrıntı. **`exclude_ambiguous` yedi değil altı karakter çıkarıyor**:
`0 O 1 I l | o` karakterlerini eliyor, ama dikey çizgi zaten sembol kümesinde
yoktu, dolayısıyla alfabe 89'dan 83'e düşüyor, 82'ye değil. Yanıtta `pool` 83
yazmasının sebebi bu. Ve **`no_repeats` mutlak bir garanti değil**: sitedeki
üreticinin yaptığı gibi on kez yeniden deniyor ve 64 karakterde yan yana bir
tekrar aşağı yukarı % 0,1 oranında geçebiliyor. Bunu söylemek, tersini vaat
etmekten daha yararlı.

## Yanıtın dili

Varsayılan olarak İngilizce yanıt veriyor; hiçbir şey belirtmeden entegre eden
kişinin beklediği de bu. URL'de `?lang=` ile, gövdede `"lang"` ile ya da
`Accept-Language` başlığıyla değiştirilir; çeliştiklerinde ilki kazanır.
Bilinmeyen bir dil hata değildir: İngilizceye düşer.

Burada tahmin edilemeyecek bir asimetri var, API bu yüzden bunu bildiriyor:
**mesajlar İngilizce ve İspanyolca var; bağlantılar sitenin on sekiz dilinde**.
Almanca istemek size Almanca bağlantılar ve hâlâ İngilizce mesajlar verir. Tahmin
etmeye gerek yok: `_meta.lang`, her yarıya ne uygulandığını
`{ "messages", "links" }` ile söylüyor.

## MCP sunucusu

MCP, bir asistanın — Claude, ChatGPT — dış araçları kullandığı protokol.
`https://api.password.es/mcp` kayıtsız ve anahtarsız bir MCP sunucusu ve tek bir
araç yayınlıyor: yukarıdakiyle aynı parametrelere sahip `generate_password`.

Bu, bizim için en önemli kısım ve teknik olduğu için değil: **şifreyi alacak bir
yeri olmayan bir asistan onu uydurur** ve oradan çıkan şey rastgele değildir,
modelin şifreye benzediğini düşündüğü şeydir. Sunucu bağlıyken doğaçlama yapmayı
bırakır ve `crypto.getRandomValues()` ile üretilmiş bir şifreyi, analiziyle ve
araç açıklamasında ve her sonuçta yer alan uyarıyla birlikte döndürür. O uyarı,
asistanın şifreyi isteyen kişiye sonunda okuduğu şeydir; orada olmasının nedeni
budur.

Başka MCP sunucularından geliyorsanız tek bir bilgi: **bu sunucu durumsuz.**
POST'a JSON ile yanıt verilir ve hiçbir akış açılmaz, `Mcp-Session-Id` ne
yayımlanır ne beklenir, bir bildirime gövdesiz 202 döner ve GET 405 verir.
2025-06-18 spesifikasyonu buna açıkça izin veriyor, ama oturum ve SSE bekleyen
biri, kimse söylemezse körlemesine hata ayıklar.

## Yapmadıkları

**`/v1/check` 501 döndürüyor.** Bu bir dalgınlık ya da yarım bırakılmış bir uç
nokta değil: bilerek böyle ve yanıtın kendisi nedenini açıklıyor. Şifre
kontrolüyle aynı sayıları döndürmek, sitede çalışan aynı örüntü motorunu
gerektiriyor ve bu, gönderilene bağlı olarak istek başına 11 ms ile 3,6 s
arasında CPU harcıyor. Kayıtsız ve anahtarsız bir serviste bu aralık bir ürün
kararı — uzunluk sınırının nereye konacağı — ve henüz alınmadı. Bu arada 501,
istenen dilde sitedeki şifre kontrolüne işaret eden bir `checker_url` taşıyor;
o kontrol bunu hiçbir şey göndermeden yapıyor.

Hesaplar da yok, anahtarlar da, planlar da. Ve var olmadıkları için API'nin
hiçbir yerinde tek bir kayıt bağlantısı yok: limit aşımı hatasında bile, ki
herkes oraya koyar.

## Limitler

Bir tane ve gerçekten uygulanan da o: **IP başına dakikada 60 istek**. Bu
sayfaya inanmak zorunda değilsiniz: sayı her yanıtın içinde,
`_meta.limits.burst` alanında geliyor. Aşıldığında `Retry-After` ve
`RateLimit-*` başlıklarıyla bir 429 dönüyor.

`_meta` içinde ayrıca değerleri `null` olan bir `quota` bloğu göreceksiniz.
Hesaplar var olduğunda kullanılacak ayrılmış yer orası ve bilerek boş: **ilan
edilip uygulanmayan bir limit, hiç limit ilan etmemekten kötüdür**, çünkü
entegre eden ona uyar ve kimsenin saymadığı bir sayıya göre kod yazar.

## Yine de iki kez düşünün

Şifre üreten bir API, özünde bir antipattern: şifre ağdan geçiyor ve size ait
olmayan bir makineden geçiyor. Hiçbir şey saklamıyor olmamız sorunun biçimini
değiştirmiyor, yalnızca bizim payımızı — ve [doğrulayamadığınız bir sözün ne
ettiğini](/tr/blog/sifreni-neden-hicbir-yere-gondermiyoruz/) zaten biliyorsunuz.

Bu yüzden uyarı yalnızca bu sayfada yaşamıyor: istediğiniz dilde, her yanıtta
geliyor. Ve bu yüzden bu paragraf burada, dokümantasyonun sonuna saklanmış
değil. **Kendinizin kullanacağı bir şifre için bu sitenin [üreticisi](/tr/)
tamamen tarayıcınızda çalışır ve hiçbir şey göndermez.** API diğeri için:
ekranın başında kimsenin olmadığı durumlar için.

Ayrıntılar iki sayfada. [API nedir](/tr/api/) kimin için olduğunu, bugün neyin
yanıt verdiğini ve neyin vermediğini anlatıyor. [Referans](/tr/api/docs/) dokuz
parametreyi, tüm alanları tek tek açıklanmış olarak, hata kodlarını ve limitleri
içeriyor; editörün yanında açılan sayfa o. Ve bunu bir makinenin okumasını
istiyorsanız `openapi.json` var.

---

*Kaynaklar: API'nin kendisi, 31 Ağustos 2026'da üretime karşı doğrulandı —
`POST /v1/generate`, `POST /v1/check` (501), `POST /mcp` ve `GET /openapi.json`
· analiz sayıları password.es'in üretici ve kontrol aracıyla aynı motordan
geliyor · saldırı modeli saniyede 10¹² deneme, çevrimdışı ve hızlı hash;
sitenin geri kalanıyla aynı · MCP sunucusu 2025-06-18 spesifikasyonunu durumsuz
Streamable HTTP taşımasıyla uyguluyor.*
