{"openapi":"3.1.0","info":{"title":"Bellwether Password Generator","version":"2.0.0","description":"Generates passwords, Bullhorn API passwords, passphrases, ULIDs and UUIDv7s. GET /passwords with curl or fetch returns JSON."},"paths":{"/passwords":{"get":{"tags":["Generator"],"operationId":"passwords","parameters":[{"name":"addNumber","in":"query","schema":{"type":"string","description":"Append a digit to one passphrase word. Default true."},"required":false},{"name":"addSymbol","in":"query","schema":{"type":"string","description":"Append a symbol to one passphrase word. Default true."},"required":false},{"name":"api_len","in":"query","schema":{"type":"string","description":"API password length, 14-36. Default 24."},"required":false},{"name":"count","in":"query","schema":{"type":"string","description":"How many of each value to return, 1-50. Default 10."},"required":false},{"name":"fmt","in":"query","schema":{"type":"string","description":"Alias of format."},"required":false},{"name":"format","in":"query","schema":{"type":"string","description":"json or html. Overrides the Accept header."},"required":false},{"name":"len","in":"query","schema":{"type":"string","description":"Length for both password and api, clamped per type."},"required":false},{"name":"len_api","in":"query","schema":{"type":"string","description":"Legacy alias of api_len."},"required":false},{"name":"len_passphrase","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"len_passphraseStrong","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"len_password","in":"query","schema":{"type":"string","description":"Legacy alias of password_len."},"required":false},{"name":"minlen_api","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"minlen_passphrase","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"minlen_passphraseStrong","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"minlen_password","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"passphrase_words","in":"query","schema":{"type":"string","description":"Passphrase word count, 3-12. Default 4."},"required":false},{"name":"passphraseStrong_words","in":"query","schema":{"type":"string","description":"Strong passphrase word count, 4-12. Default 5."},"required":false},{"name":"password_len","in":"query","schema":{"type":"string","description":"Password length, 8-64. Default 14."},"required":false},{"name":"separator","in":"query","schema":{"type":"string","description":"Passphrase separator, at most 16 characters. Default _."},"required":false},{"name":"ui","in":"query","schema":{"type":"string","description":"Alias of format."},"required":false},{"name":"words_passphrase","in":"query","schema":{"type":"string","description":"Legacy alias of passphrase_words."},"required":false},{"name":"words_passphraseStrong","in":"query","schema":{"type":"string","description":"Legacy alias of passphraseStrong_words."},"required":false}],"security":[],"responses":{"200":{"description":"Passwords","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordsEncoded"}}}},"422":{"description":"InvalidSeparator","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidSeparatorEncoded"}}}},"429":{"description":"RateLimited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}}}},"/":{"get":{"tags":["Generator"],"operationId":"root","parameters":[{"name":"addNumber","in":"query","schema":{"type":"string","description":"Append a digit to one passphrase word. Default true."},"required":false},{"name":"addSymbol","in":"query","schema":{"type":"string","description":"Append a symbol to one passphrase word. Default true."},"required":false},{"name":"api_len","in":"query","schema":{"type":"string","description":"API password length, 14-36. Default 24."},"required":false},{"name":"count","in":"query","schema":{"type":"string","description":"How many of each value to return, 1-50. Default 10."},"required":false},{"name":"fmt","in":"query","schema":{"type":"string","description":"Alias of format."},"required":false},{"name":"format","in":"query","schema":{"type":"string","description":"json or html. Overrides the Accept header."},"required":false},{"name":"len","in":"query","schema":{"type":"string","description":"Length for both password and api, clamped per type."},"required":false},{"name":"len_api","in":"query","schema":{"type":"string","description":"Legacy alias of api_len."},"required":false},{"name":"len_passphrase","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"len_passphraseStrong","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"len_password","in":"query","schema":{"type":"string","description":"Legacy alias of password_len."},"required":false},{"name":"minlen_api","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"minlen_passphrase","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"minlen_passphraseStrong","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"minlen_password","in":"query","schema":{"type":"string","description":"Ignored legacy parameter."},"required":false},{"name":"passphrase_words","in":"query","schema":{"type":"string","description":"Passphrase word count, 3-12. Default 4."},"required":false},{"name":"passphraseStrong_words","in":"query","schema":{"type":"string","description":"Strong passphrase word count, 4-12. Default 5."},"required":false},{"name":"password_len","in":"query","schema":{"type":"string","description":"Password length, 8-64. Default 14."},"required":false},{"name":"separator","in":"query","schema":{"type":"string","description":"Passphrase separator, at most 16 characters. Default _."},"required":false},{"name":"ui","in":"query","schema":{"type":"string","description":"Alias of format."},"required":false},{"name":"words_passphrase","in":"query","schema":{"type":"string","description":"Legacy alias of passphrase_words."},"required":false},{"name":"words_passphraseStrong","in":"query","schema":{"type":"string","description":"Legacy alias of passphraseStrong_words."},"required":false}],"security":[],"responses":{"200":{"description":"Passwords","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordsEncoded"}}}},"422":{"description":"InvalidSeparator","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidSeparatorEncoded"}}}},"429":{"description":"RateLimited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}}}}},"components":{"schemas":{"RateLimitedEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["RateLimited"]},"message":{"type":"string"}},"required":["_tag","message"],"additionalProperties":false},"InvalidSeparatorEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InvalidSeparator"]},"message":{"type":"string"},"reason":{"type":"string","enum":["too-long","control-characters"]}},"required":["_tag","message","reason"],"additionalProperties":false},"PasswordsEncoded":{"type":"object","properties":{"api":{"type":"array","items":{"type":"string"},"description":"Bullhorn API passwords: underscore is the only symbol."},"config":{"type":"object","properties":{"addNumber":{"type":"boolean"},"addSymbol":{"type":"boolean"},"apiSymbols":{"type":"string"},"defaultLen":{"type":"object","properties":{"api":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphrase":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphraseStrong":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"password":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["api","passphrase","passphraseStrong","password"],"additionalProperties":false},"defaultWords":{"type":"object","properties":{"passphrase":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphraseStrong":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["passphrase","passphraseStrong"],"additionalProperties":false},"len":{"type":"number","description":"The global len as parsed, before clamping. Absent when len is missing or not a positive number."},"maxLen":{"type":"object","properties":{"api":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphrase":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphraseStrong":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"password":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["api","passphrase","passphraseStrong","password"],"additionalProperties":false},"maxWords":{"type":"object","properties":{"passphrase":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphraseStrong":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["passphrase","passphraseStrong"],"additionalProperties":false},"minLen":{"type":"object","properties":{"api":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphrase":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphraseStrong":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"password":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["api","passphrase","passphraseStrong","password"],"additionalProperties":false},"minWords":{"type":"object","properties":{"passphrase":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphraseStrong":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["passphrase","passphraseStrong"],"additionalProperties":false},"separator":{"type":"string"},"type":{"type":"string","enum":["url-safe"]}},"required":["addNumber","addSymbol","apiSymbols","defaultLen","defaultWords","maxLen","maxWords","minLen","minWords","separator","type"],"additionalProperties":false},"effectiveLen":{"type":"object","properties":{"api":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphrase":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passphraseStrong":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"password":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["api","passphrase","passphraseStrong","password"],"additionalProperties":false},"guids":{"type":"array","items":{"type":"string"},"description":"UUID version 7."},"isostring":{"type":"string"},"notes":{"type":"array","items":{"type":"string"}},"passwords":{"type":"array","items":{"type":"string"},"description":"URL-safe passwords: upper, lower, digit and one of - . _ ~."},"phrases":{"type":"array","items":{"type":"string"},"description":"EFF diceware passphrases."},"phrases_strong":{"type":"array","items":{"type":"string"},"description":"Pronounceable pseudo-word passphrases."},"queryStringParameters":{"type":"object","additionalProperties":{"type":"string"},"description":"Query parameters after normalization. Absent when there are none, as in the legacy Lambda."},"timestamp":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Generation time, epoch milliseconds."},"ulids":{"type":"array","items":{"type":"string"},"description":"ULIDs."}},"required":["api","config","effectiveLen","guids","isostring","notes","passwords","phrases","phrases_strong","timestamp","ulids"],"additionalProperties":false}},"securitySchemes":{}},"security":[],"tags":[{"name":"Generator","description":"Any client that does not send Accept: text/html gets JSON. Add ?format=json to force it."}]}