Seeded memorable passphrase generator
This seeded memorable passphrase generator turns a private seed into a repeatable sequence of plain English words.
Run — free
Choose a word count of at least three and a separator, then receive both the finished passphrase and the individual words. Because the process is deterministic, the same seed, count, and separator always return the same result across supported environments. That makes the tool useful for reproducible tests, controlled recovery workflows, and systems that must derive a human-readable phrase without storing the phrase itself. The seed remains the critical secret: anyone who can guess it can reproduce the output.
How deterministic passphrase generation works
A conventional password generator draws fresh random characters each time, so repeating a request produces a different answer. This generator serves a different purpose. It converts the supplied seed into a fixed internal state, advances that state once for every requested word, and maps each value to one entry in a curated list of 256 distinct lowercase English words. The selected words are then joined with the separator you provide. There is no network request, system clock, runtime random source, or changing external dictionary involved. As a result, identical inputs reproduce the same passphrase exactly, including word order and punctuation. The response also includes the words as an array, which is useful when an interface needs to display, speak, or validate each component separately. The word count must be an integer from 3 through 24. The seed must be a non-empty string, and the separator must contain between one and three characters. Those bounds keep the operation predictable and prevent ambiguous empty separators or unbounded work.
Choose a seed with the right security properties
Determinism is useful, but it changes the security model. The passphrase is only as difficult to reproduce as the seed is difficult to guess. A public username, an email address, a birthday, a project name, or a familiar quotation is not a suitable secret seed, even if the resulting words look unusual. An attacker can try likely seed values with the same algorithm and compare the derived phrase. For security-sensitive use, start with seed material created and stored by a trusted secret-management process, and keep it separate from the generated passphrase. Increasing the word count makes the displayed phrase longer, but it does not repair a weak or exposed seed. This tool also does not add fresh randomness on each run, rotate credentials, measure password policy compliance, or protect the seed after you submit it to your own application. Treat the result as a deterministic derivation, not as proof of entropy. If your goal is a new independent credential every time, use a cryptographically secure random password or Diceware generator instead.
Use repeatability without creating hidden surprises
A seeded passphrase is particularly helpful when tests, fixtures, offline tools, or recovery procedures must agree on a readable value without exchanging that value directly. Record the exact word count, separator, algorithm version, and seed-handling rules alongside the workflow. Changing any input changes the rendered passphrase, while changing only the separator preserves the selected words but changes the final string. Before adopting the output as a credential, confirm that the destination accepts its length and chosen punctuation. Some systems reject spaces, repeated separators, or long values even when those values are otherwise valid. Avoid placing the seed in URLs, analytics fields, source control, screenshots, support tickets, or ordinary logs. For automation, use the returned passphrase field when a single string is required and the words array when downstream code needs structured components. Requests through the API cost $0.002 each, while the deterministic response shape makes regression checks straightforward: freeze a known non-secret test seed in test fixtures, but keep production seeds outside code and documentation.
What you can do with it
Reproducible test credentials
Derive stable, readable fixture values from explicitly non-secret test seeds without storing many generated strings.
Controlled recovery phrases
Recreate a memorable phrase when an approved recovery process can securely provide the same private seed and settings.
Consistent offline and server output
Generate the same word sequence in a browser and an API workflow without relying on a shared random-number service.
FAQ
Is the generated passphrase random?
No. It is deterministic: the same seed and word count select the same words. Use a secure random generator when you need a fresh independent credential.
What happens when the word count is below three?
The request fails with an invalid input error. Valid word counts range from 3 through 24.
Can I use a space as the separator?
Yes. The separator may be any string from one to three characters, including a single space.
Does a longer phrase compensate for a weak seed?
No. Someone who guesses the seed can reproduce every requested word count. Protect the seed and make it difficult to predict.
Will the same inputs work across environments?
Yes. The algorithm and curated word list are fixed in the capability, with no network, clock, or random dependency.
How much does an API request cost?
Each API request costs $0.002. The browser experience can run the same pure logic locally.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/security/passphrase-generate-seeded \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"word_count":6,"seed":"correct horse workshop 2026"}'const res = await fetch("https://api.kit.forhosting.com/security/passphrase-generate-seeded", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"word_count": 6,
"seed": "correct horse workshop 2026"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/security/passphrase-generate-seeded",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"word_count": 6,
"seed": "correct horse workshop 2026"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/security/passphrase-generate-seeded", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"word_count":6,"seed":"correct horse workshop 2026"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"word_count":6,"seed":"correct horse workshop 2026"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/security/passphrase-generate-seeded", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"word_count": 6,
"seed": "correct horse workshop 2026"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "security.passphrase_generate_seeded",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |