# API password.es sudah menjawab: cara memakainya

> Satu panggilan tanpa kunci dan tanpa pendaftaran yang mengembalikan kata sandi beserta angka yang sama seperti di situs ini: bit, waktu pembobolan, dan level. Termasuk apa yang belum bisa dilakukannya, dan kenapa memanggilnya tidak selalu ide bagus.

2026-08-31 · David Carrero · password.es
Original: https://password.es/id/blog/api-pembuat-kata-sandi/

---

Blog ini sudah berbulan-bulan mengulang hal yang sama: [kata sandimu tidak boleh
keluar dari peramban](/id/blog/kenapa-kami-tidak-mengirim-kata-sandimu/).
[Pembuat kata sandi](/id/) mengambil keacakan dari `crypto.getRandomValues()` di
mesinmu sendiri, dan [pemeriksa](/id/pemeriksa/) menganalisis apa yang kamu
ketik tanpa mengirimnya ke mana pun.

Dan hari ini kami merilis API yang membuat kata sandi di sebuah server.

**Kontradiksinya jelas dan kami tidak akan menutupinya**: setiap respons API
membawa peringatan yang mengatakan persis itu. Tapi ada tempat-tempat yang tidak
punya peramban — skrip yang membuat seratus akun, server yang mencetak kredensial
sementara, asisten yang dimintai kata sandi lalu mengarangnya — dan di sana
alternatifnya bukan «peramban»: melainkan `random()` yang salah pilih atau
untaian yang diketik dengan tangan. Untuk itulah ini ada.

## Seluruh panggilannya

Tanpa kunci, tanpa pendaftaran, tanpa header. Hanya ini:

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

Ia mengembalikan kata sandi 16 karakter beserta analisisnya. Dijalankan saat
paragraf ini ditulis: `x*7$9,BUy9PPvOI?`, diambil dari alfabet 89 karakter,
**103,6 bit** entropi, dan waktu pembobolan 2,5 × 10¹¹ tahun. Level 4 dari 4.

Tidak ada satu pun angka itu yang baru. Semuanya keluar dari mesin yang sama
yang menggambar meteran di halaman depan: rumus [bit](/id/blog/apa-itu-bit-entropi/)
yang sama, model serangan yang sama — 10¹² tebakan per detik, luring, hash cepat
— dan skala level yang sama dengan pemeriksa. Kalau situs dan API memberi angka
berbeda untuk kata sandi yang sama, salah satunya berbohong.

## Apa yang kembali, bidang demi bidang

Respons membawa `passwords` — selalu berupa array, bahkan saat kamu minta satu —
dan blok `analysis` berisi `length`, `pool`, `bits`, `log10_guesses`,
`crack_time_log10_seconds`, `crack_time`, `level`, `level_scale`, dan `ceiling`.

Dua di antaranya layak satu paragraf. **`level_scale` menyebut dari mana level
itu berasal** (hari ini selalu `"time"`), supaya perbedaan di masa depan antara
situs dan API terlihat di bidangnya alih-alih harus disimpulkan dengan
membandingkan angka. Dan **`ceiling` menyebut apakah angkanya persis atau
sekadar batas atas**: di `generate` selalu `false`, karena kata sandinya dibuat
server dan ia tahu alfabetnya; di pemeriksa situs tidak selalu bisa begitu,
karena di sana kata sandinya kamu yang bawa.

Lalu ada `notice`, peringatannya, dan blok `_meta` berisi paket, bahasa yang
dipakai, batas-batasnya, dan tautan kembali ke dokumentasi.

## Opsinya

Semuanya opsional, dengan nama dalam bahasa Inggris karena orang yang
mengintegrasikan API menyalin nama bidang apa adanya: `length` (4–64, bawaan
16), `count` (1–20), `lower`, `upper`, `digits`, `symbols`,
`exclude_ambiguous`, `no_repeats`, dan `lang`.

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

Dua detail yang dijelaskan dokumentasi dan sebaiknya kamu tahu sebelum
mengintegrasikan. **`exclude_ambiguous` membuang enam karakter, bukan tujuh**: ia
mencoret `0 O 1 I l | o`, tapi garis tegak memang tidak ada di himpunan simbol
sejak awal, jadi alfabetnya turun dari 89 ke 83, bukan ke 82. Itu sebabnya
respons menulis `pool` 83. Dan **`no_repeats` bukan jaminan mutlak**: ia mencoba
ulang sepuluh kali, persis seperti pembuat kata sandi di situs, dan pada 64
karakter pengulangan bersebelahan masih lolos sekitar 0,1 % kejadian.
Mengatakannya lebih berguna daripada menjanjikan sebaliknya.

## Bahasanya

Secara bawaan ia menjawab dalam bahasa Inggris, yang memang diharapkan orang
yang mengintegrasikan tanpa menyebut apa-apa. Diubah dengan `?lang=` di URL,
dengan `"lang"` di badan permintaan, atau dengan header `Accept-Language`, dan
kalau bertentangan yang pertama menang. Bahasa yang tidak dikenal bukan galat:
ia jatuh ke bahasa Inggris.

Ada asimetri di sini yang tidak bisa ditebak, dan karena itu API menyatakannya:
**pesan tersedia dalam bahasa Inggris dan Spanyol; tautan dalam delapan belas
bahasa situs**. Meminta bahasa Jerman memberimu tautan berbahasa Jerman dan
pesan yang masih berbahasa Inggris. Tidak perlu menduga: `_meta.lang` membawa
`{ "messages", "links" }` berisi apa yang diterapkan pada masing-masing bagian.

## Server MCP

MCP adalah protokol yang dipakai asisten — Claude, ChatGPT — untuk memakai
perkakas eksternal. `https://api.password.es/mcp` adalah server MCP tanpa
pendaftaran dan tanpa kunci, dan ia menerbitkan satu perkakas:
`generate_password`, dengan parameter yang sama seperti di atas.

Ini bagian yang paling kami pedulikan, dan bukan karena sisi teknisnya:
**asisten yang tidak punya tempat mengambil kata sandi akan mengarangnya**, dan
yang keluar dari situ bukan acak, melainkan apa yang menurut model berbentuk
kata sandi. Dengan server tersambung, ia berhenti berimprovisasi dan
mengembalikan kata sandi yang dibuat dengan `crypto.getRandomValues()`, lengkap
dengan analisis dan peringatan yang ada di deskripsi perkakas dan di setiap
hasil. Peringatan itulah yang akhirnya dibacakan asisten kepada orang yang
meminta kata sandi, dan karena itu ia ada di sana.

Kalau kamu datang dari server MCP lain, satu hal: **yang ini tanpa status.**
POST dijawab dengan JSON dan tidak membuka stream apa pun, `Mcp-Session-Id`
tidak dikeluarkan maupun ditunggu, sebuah notifikasi dijawab 202 tanpa badan,
dan GET mengembalikan 405. Spesifikasi 2025-06-18 mengizinkannya secara
eksplisit, tapi orang yang mengharapkan sesi dan SSE akan menelusuri galat
dalam gelap kalau tidak ada yang memberi tahu.

## Yang belum bisa

**`/v1/check` mengembalikan 501.** Itu bukan kelalaian atau endpoint setengah
jadi: memang disengaja, dan responsnya sendiri menjelaskan kenapa. Mengembalikan
angka yang sama dengan pemeriksa menuntut mesin pola yang persis sama seperti
yang berjalan di situs, dan itu memakan 11 ms sampai 3,6 detik CPU per
permintaan tergantung apa yang dikirim. Pada layanan tanpa pendaftaran dan tanpa
kunci, rentang itu adalah keputusan produk — di mana batas panjang dipasang —
yang belum diambil. Sementara itu, 501 membawa `checker_url` yang menunjuk ke
pemeriksa di situs dalam bahasa yang kamu minta, yang melakukan persis ini tanpa
mengirim apa pun.

Akun juga belum ada, begitu pula kunci dan paket berbayar. Dan karena belum ada,
di seluruh API tidak ada satu pun tautan pendaftaran: bahkan di galat batas
terlampaui, tempat semua orang memasangnya.

## Batasnya

Satu, dan itulah yang benar-benar diterapkan: **60 permintaan per menit per IP**.
Kamu tidak perlu percaya halaman ini: angkanya ikut di dalam setiap respons, di
`_meta.limits.burst`. Kalau terlampaui, keluar 429 dengan `Retry-After` dan
header `RateLimit-*`.

Di `_meta` kamu juga akan melihat blok `quota` dengan nilai `null`. Itu ruang
yang disediakan untuk saat akun sudah ada, dan sengaja dibiarkan kosong:
**batas yang diumumkan tapi tidak ditegakkan lebih buruk daripada tidak
mengumumkan batas apa pun**, karena orang yang mengintegrasikan akan
mematuhinya dan menulis kode terhadap angka yang tidak dihitung siapa pun.

## Dan meski begitu, pikirkan dua kali

API yang membuat kata sandi pada dasarnya adalah antipola: kata sandinya
melintasi jaringan dan melewati mesin yang bukan milikmu. Kami tidak menyimpan
apa pun tidak mengubah bentuk masalahnya, hanya bagian kami — dan kamu sudah
tahu berapa nilai [sebuah janji yang tidak bisa kamu
periksa](/id/blog/kenapa-kami-tidak-mengirim-kata-sandimu/).

Karena itu peringatannya tidak hanya tinggal di halaman ini: ia ikut di setiap
respons, dalam bahasa yang kamu minta. Dan karena itu paragraf ini ada di sini,
bukan disembunyikan di akhir dokumentasi. **Untuk kata sandi yang akan kamu
pakai sendiri, [pembuat kata sandi](/id/) situs ini berjalan sepenuhnya di
perambanmu dan tidak mengirim apa pun.** API ini untuk hal yang lain: untuk yang
terjadi tanpa siapa pun di depan layar.

Detailnya ada di dua halaman. [Apa itu API-nya](/id/api/) menjelaskan untuk
siapa ia dibuat, apa yang menjawab hari ini dan apa yang tidak.
[Referensinya](/id/api/docs/) memuat sembilan parameter, semua bidang dijelaskan
satu per satu, kode galat, dan batasnya; itu halaman yang dibuka di sebelah
editor. Dan kalau yang kamu mau adalah mesin yang membacanya, ada
`openapi.json`.

---

*Sumber: API-nya sendiri, diverifikasi terhadap produksi pada 31 Agustus 2026 —
`POST /v1/generate`, `POST /v1/check` (501), `POST /mcp`, dan
`GET /openapi.json` · angka analisis keluar dari mesin yang sama dengan pembuat
dan pemeriksa kata sandi password.es · model serangannya 10¹² tebakan per detik,
luring dan dengan hash cepat, sama seperti bagian lain situs ini · server MCP
mengimplementasikan spesifikasi 2025-06-18 dengan transport Streamable HTTP
tanpa status.*
