# Pasahitzen APIaren erreferentzia · password.es

> POST /v1/generate aginduaren parametro guztiak, erantzunaren eremu bakoitza, errore-kodeak eta api.password.es zerbitzuaren mugak. Dabilen curl adibide batekin.

password.es · Original: https://password.es/eu/api/docs/

---

# Pasahitzen APIaren erreferentzia

`api.password.es` zerbitzuaren erreferentzia: parametro bakoitza, erantzunaren eremu bakoitza, errore-kode bakoitza eta mugak. Adibideak dauden bezala itsatsi daitezke terminal batean.

Zer den, norentzat den eta noiz *ez* den komeni jakin nahi baduzu, hasi [APIaren orritik](https://password.es/eu/api/).

## Endpointak

Dena `https://api.password.es` helbidetik zintzilik dago. Bik erantzuten dute eta batek oraindik ez — eta horrek bere erantzunean esaten du.

- POST/v1/generate Pasahitz bat edo gehiago sortzen ditu eta haien analisia itzultzen du.
- GET/openapi.json APIaren deskribapena, OpenAPI 3.1 formatuan.
- POST/mcp MCP zerbitzaria laguntzaileentzat. Tresna bat: `generate_password`.
- POST/v1/check 501 Oraindik ez dago. Erroreak zer falta den eta bitartean nora jo esaten du.

## Pasahitz bat sortu

Gorputza aukerakoa da: gabe, 16 karaktere ateratzen dira lau motak aktibatuta. Berarekin, eskatzen duzuna.

Eskaera

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

Erantzuna

```
{
  "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/"
  }
}
```

## Parametroak

Denak aukerakoak. Taula ingelesez dago eta berdina da hemezortzi hizkuntzetan, nahita: API bat integratzen duenak eremuen izenak idatzita dauden bezalaxe idazten ditu, eta `exclude_ambiguous` hemezortzi aldiz itzultzea zorra litzateke, ez irismena.

- 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.

## Zenbaki bakoitzak zer esan nahi duen

Ideia bera: erreferentzia ingelesez, azalpena ondoan. Zenbaki hauetako bat bera ere ez da berria — denak azalean neurgailua marrazten duen motor beretik ateratzen dira.

- 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 10^12 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.

## Erantzunaren hizkuntza

Lehenetsita ingelesez erantzuten du, ezer esan gabe integratzen duenak espero duena. Hiru modutan alda daiteke, eta bat ez datozenean lehenak irabazten du: `?lang=` URLan, `"lang"` gorputzean, eta `Accept-Language` goiburua.

Hemen jakitea komeni den asimetria bat dago: **mezuak ingelesez eta gaztelaniaz daude; estekak, gunearen hemezortzi hizkuntzetan.** Alemana eskatzeak alemanezko estekak ematen dizkizu eta mezuak oraindik ingelesez.

Eskaera

```
curl -X POST 'https://api.password.es/v1/generate?lang=de' \
  -H 'content-type: application/json' \
  -d '{"length":20}'
```

Erantzuna

```
"_meta": {
  "lang": { "messages": "en", "links": "de" }
}
```

Ez dago asmatu beharrik: erantzun bakoitzak `_meta.lang` atalean adierazten du zer aplikatu zaion erdi bakoitzari. Eta existitzen ez den hizkuntza bat ez da errorea — ingelesera erortzen da, eta `_meta.lang` hala dio.

## Pasahitz bat egiaztatu: oraindik ez

`/v1/check` aginduak `501` itzultzen du. Ez da akatsa ez ahanztura: nahita dago, eta erantzunak zer falta den eta bitartean nora jo azaltzen du. `checker_url` eremuak guneko egiaztatzailera darama, eskatu duzun hizkuntzan.

Eskaera

```
curl -X POST https://api.password.es/v1/check \
  -H 'content-type: application/json' \
  -d '{"password":"x"}'
```

Erantzuna

```
{
  "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" }
}
```

## Erroreak

Denek forma bera dute: `error` labur bat kodearentzat, `message` bat prosan —hori da IA laguntzaile batek bere erabiltzaileari irakurtzen diona—, batzuetan eragin duen `field`, `docs` bat eta betiko `_meta` bera.

- 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.

## Mugak

Bakarra, eta benetan betearazten dena: **minutuko 60 eskaera IP bakoitzeko**. Ez duzu orri hau sinetsi beharrik: zenbakia erantzun bakoitzean bidaiatzen du, `_meta.limits.burst` barruan.

Muga gaindituz gero, erantzuna `429` bat da, `Retry-After` eta `RateLimit-*` goiburuekin, eta zer egin esaten duen mezu argi batekin. Ez darama izen-emateko ez prezioetarako estekarik, ez baitago ez izen-ematerik ez preziorik.

`_meta` barruan `quota` bloke bat ere ikusiko duzu, bi balioak `null` dituela. Nahita dago horrela: kontuak existitzen direnerako gordetako hutsunea da, eta hutsik doa gaur inork ez duelako eguneko eskaerarik zenbatzen. Iragarri eta betearazten ez den muga bat bat ere ez iragartzea baino okerragoa da.

## MCP zerbitzaria

MCP da Claude edo ChatGPT bezalako laguntzaileek kanpoko tresnak erabiltzeko protokoloa. Lotu helbide hau zure laguntzaileari eta pasahitzak sortuko ditu zenbaki hauekin berekin, asmatu beharrean. Erregistrorik eta gakorik gabe, eta minutuko 60 eskaeren muga berarekin.

**Egoerarik gabeko** zerbitzaria da, eta jakitea komeni da beste MCP zerbitzari batzuetatik bazatoz: POSTari JSONez erantzuten zaio eta ez da stream-ik irekitzen, `Mcp-Session-Id` ez da bidaltzen ez espero, jakinarazpen bati `202` erantzuten zaio gorputzik gabe, eta GETek `405` itzultzen du. 2025-06-18 zehaztapenak esplizituki onartzen du.

```
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"}}}'
```

**Tresna bakarra** argitaratzen du, `generate_password`, goiko taulako parametro berberekin eta `lang` gehituta. Ez dago `check_password_strength` eta ez da egongo `/v1/check` existitu arte: beti errorea itzultzen duen tresna bat ez da tresna bat, laguntzaile baten katalogoan hautsitako promesa bat baizik.

Hau antipatroi bat dela dioen oharra tresnaren deskribapenean eta emaitza bakoitzean doa. Nahita da: laguntzaileak pasahitza eskatu duenari irakurtzen diona da.

## Makinek irakurtzen duten dokumentazioa

Orri honetaz gain, **OpenAPI 3.1** deskribapen bat dago, eta hori bai argitaratuta dago: [api.password.es/openapi.json](https://api.password.es/openapi.json). Bezero-sorgailu batek, osatze automatikoa duen editore batek edo zein eremu dauden inork esan gabe jakin nahi duen agente batek irakurtzen duena da. Goiko taulako parametro berak deskribatzen ditu, errore-kodeak eta `quota` hutsaren zergatia.
