Uç noktalar
Her şey https://api.password.es altında. İkisi yanıt veriyor, biri henüz değil — ve o, bunu kendi yanıtında söylüyor.
- POST/v1/generate Bir ya da birkaç parola üretir ve çözümlemesini döndürür.
- GET/openapi.json API'nin OpenAPI 3.1 biçimindeki tanımı.
-
POST/mcp
Asistanlar için MCP sunucusu. Tek araç:
generate_password. - POST/v1/check 501 Henüz yok. Hata, neyin eksik olduğunu ve bu arada nereye gidileceğini söyler.
Parola üretmek
Gövde isteğe bağlı: gövdesiz, dört karakter türü de açık 16 karakter gelir. Gövdeyle, ne istersen.
curl -X POST https://api.password.es/v1/generate \
-H 'content-type: application/json' \
-d '{"length":20,"exclude_ambiguous":true}'
{
"passwords": [
"P#f.aK+w4pcsx]}Gx;*>"
],
"analysis": {
"length": 20,
"pool": 83,
"bits": 127.50078862693852,
"log10_guesses": 38.08053185185735,
"crack_time_log10_seconds": 26.08053185185735,
"crack_time": {
"value": "3.8 × 10¹⁸",
"unit": "years"
},
"level": 4,
"level_scale": "time",
"ceiling": false
},
"notice": "Generated on someone else's machine, which is a security antipattern even though we store nothing. For a password you will actually use, the generator at https://password.es/en/ runs entirely in your browser and sends nothing.",
"_meta": {
"plan": "anonymous",
"lang": {
"messages": "en",
"links": "en"
},
"limits": {
"burst": {
"limit": 60,
"window_seconds": 60
}
},
"quota": {
"limit": null,
"remaining": null,
"reset": "2026-09-01T00:00:00.000Z"
},
"docs": "https://password.es/api/"
}
}
Parametreler
Hepsi isteğe bağlı. Tablo İngilizce ve on sekiz dilde birebir aynı; bilerek: bir API'yi entegre eden kişi alan adlarını yazıldığı gibi yazar, ve exclude_ambiguous sözcüğünün on sekiz çevirisi kapsam değil, borç olurdu.
| Field | Type | Default | Notes |
|---|---|---|---|
| length | integer 4–64 | 16 | How many characters. The same range as the generator on this site. |
| count | integer 1–20 | 1 | How many passwords to return. passwords is always an array, including with count 1. |
| lower | boolean | true | Include a–z (26 characters). |
| upper | boolean | true | Include A–Z (26 characters). |
| digits | boolean | true | Include 0–9 (10 characters). |
| symbols | boolean | true | Include ~!@#$%^&*()_+-=[]{};:,./<>? — the same 27 as the slider on the home page, no more. |
| exclude_ambiguous | boolean | false | Drops 0 O 1 I l | o. Six of them in practice, not seven: | is not in the symbol set to begin with. That is why pool reads 83 above instead of 89. |
| no_repeats | boolean | false | Avoids adjacent repeated characters. Not an absolute guarantee: it retries ten times, exactly as the web generator does. At length 64 that lets a repeat through about 0.1% of the time. |
| lang | string | en | Which language to answer in. One of the site's eighteen. Also accepted as ?lang= in the URL, which wins over this field; without either, Accept-Language is read. An unknown value is not an error — it falls back to English. See the section below: messages exist in English and Spanish, links in all eighteen. |
Her sayı ne anlama geliyor
Aynı mantık: başvuru İngilizce, açıklaması yanında. Bu sayıların hiçbiri yeni değil — hepsi ana sayfadaki göstergeyi çizen aynı motordan çıkıyor.
| Field | Notes |
|---|---|
| passwords | An array of strings, always — including with count 1. |
| analysis.length | How many characters came back. |
| analysis.pool | The size of the alphabet the password was drawn from. |
| analysis.bits | H = L·log2(N), the same formula as the home page. With no_repeats it becomes log2(N)+(L-1)·log2(N-1). |
| analysis.log10_guesses | The expected work, as a base-10 logarithm: half the keyspace. |
| analysis.crack_time_log10_seconds | At 1012 guesses/s, offline, fast hash. The same attack model as the rest of the site. |
| analysis.crack_time | The same figure in words. unit follows the answer language: years, años… |
| analysis.level | 0–4. The same scale as the checker, ever since the site unified the two it used to have. |
| analysis.level_scale | "time". Says where the level came from, so that a future divergence is visible instead of having to be inferred by comparing numbers. |
| analysis.ceiling | false: the server generated the password, so the figure is exact and not a ceiling. The same flag the checker uses. |
| notice | The antipattern warning, in every single response. |
| _meta.plan | "anonymous". The only lane there is; the others arrive with accounts. |
| _meta.lang | { "messages", "links" } — which language each half actually came back in. They can differ, and that is why the API says so instead of leaving you to guess. |
| _meta.limits.burst | The rate limit actually enforced: limit requests per window_seconds. |
| _meta.quota | The reserved daily-quota slot. limit and remaining are null because nobody counts daily requests yet. |
| _meta.docs | A link back to the documentation. |
Yanıtın dili
Varsayılan olarak İngilizce yanıt verir; hiçbir şey söylemeden entegre eden birinin beklediği budur. Üç yolla değişir, ve çelişirlerse ilki kazanır: URL'de ?lang=, gövdede "lang" ve Accept-Language başlığı.
Burada bilinmesi gereken bir asimetri var: iletiler İngilizce ve İspanyolca var; bağlantılar, sitenin on sekiz dilinin hepsinde. Almanca istemek sana Almanca bağlantılar ve hâlâ İngilizce iletiler verir.
curl -X POST 'https://api.password.es/v1/generate?lang=de' \
-H 'content-type: application/json' \
-d '{"length":20}'
"_meta": {
"lang": { "messages": "en", "links": "de" }
}
Tahmin etmene gerek yok: her yanıt _meta.lang içinde her yarıya ne uygulandığını bildirir. Ve var olmayan bir dil hata değildir — İngilizceye düşer, ve _meta.lang bunu söyler.
Parola denetlemek: henüz değil
/v1/check 501 döndürür. Ne bir hata ne bir unutkanlık: bilerek öyle, ve yanıt neyin eksik olduğunu ve bu arada nereye gidileceğini anlatır. checker_url, istediğin dilde sitenin denetleyicisini gösterir.
curl -X POST https://api.password.es/v1/check \
-H 'content-type: application/json' \
-d '{"password":"x"}'
{
"error": "not_implemented",
"message": "/v1/check does not exist yet. Returning the same numbers as the password.es checker requires its very same pattern engine, and that costs between 11 ms and 3.6 s of CPU per request depending on the input: it is waiting on a plan cap decision and on a length cap. Meanwhile the web checker does exactly this in your browser, sending nothing: https://password.es/en/checker/",
"checker_url": "https://password.es/en/checker/",
"docs": "https://password.es/api/",
"_meta": { "…": "igual que arriba" }
}
Hatalar
Hepsi aynı biçimde: kod için kısa bir error, düz metin bir message —bir yapay zekâ asistanının kullanıcısına okuduğu şey budur—, bazen buna yol açan field, bir docs ve her zamanki _meta.
| HTTP | error | Notes |
|---|---|---|
| 400 | invalid_length | length outside 4–64. field names it. |
| 400 | invalid_count | count outside 1–20. field names it. |
| 400 | empty_alphabet | All four character types turned off, so there is no alphabet to draw from. No field: it is the combination, not one parameter. |
| 400 | unknown_parameter | A parameter this endpoint does not accept. field gives the offending name. |
| 429 | rate_limited | Over 60 requests in a minute. Carries Retry-After and RateLimit-* headers, and limit / window_seconds in the body. |
| 501 | not_implemented | Only from /v1/check. Carries checker_url, pointing at the web checker in the answer language. |
Sınırlar
Tek bir tane, ve gerçekten uygulanan da o: IP başına dakikada 60 istek. Bu sayfaya inanmak zorunda değilsin: sayı her yanıtta, _meta.limits.burst içinde geliyor.
Aşıldığında yanıt, Retry-After ve RateLimit-* başlıklarıyla bir 429 ve ne yapılacağını düz metinle anlatan bir iletidir. İçinde kayda ya da fiyatlara bağlantı yoktur, çünkü ne kayıt vardır ne fiyat.
_meta içinde ayrıca iki değeri de null olan bir quota bloğu göreceksin. Bilerek öyle: hesaplar var olduğunda doldurulmak üzere ayrılmış boşluk, ve boş çünkü bugün kimse günlük istek saymıyor. Duyurulup uygulanmayan bir sınır, hiç duyurmamaktan kötüdür.
MCP sunucusu
MCP, Claude veya ChatGPT gibi asistanların dış araçları kullandığı protokoldür. Bu adresi asistanınıza bağlayın; parolaları uydurmak yerine tam olarak bu sayılarla üretecektir. Kayıt yok, anahtar yok ve dakikada 60 istek sınırı aynı.
Durumsuz bir sunucudur ve başka MCP sunucularından geliyorsanız bilmekte fayda var: POST'a JSON ile yanıt verilir, akış açılmaz, Mcp-Session-Id ne gönderilir ne beklenir, bildirime gövdesiz 202 döner ve GET 405 verir. 2025-06-18 belirtimi buna açıkça izin verir.
curl -X POST https://api.password.es/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"generate_password",
"arguments":{"length":20,"lang":"es"}}}'
Tek bir araç yayımlar, generate_password, yukarıdaki tablodaki parametrelerle ve ek olarak lang ile. check_password_strength yoktur ve /v1/check var olmadıkça olmayacaktır: her zaman hata döndüren bir araç, araç değildir; bir asistanın kataloğundaki kırık bir sözdür.
Bunun bir antipattern olduğu uyarısı, aracın açıklamasında ve her sonuçta yolculuk eder. Bu bilinçlidir: asistanın, parolayı isteyen kişiye okuyacağı şey budur.
Makinelerin okuduğu belgeler
Bu sayfanın yanında bir de OpenAPI 3.1 tanımı var, ve o yayımlandı: api.password.es/openapi.json. Bir istemci üreteci, otomatik tamamlamalı bir düzenleyici ya da hangi alanların bulunduğunu kimse söylemeden öğrenmek isteyen bir aracı bunu okur. Yukarıdaki tablodaki parametreleri, hata kodlarını ve quota alanının neden boş olduğunu anlatır.