A word-of-the-day API for word games.
GET /?{mode}&{filters}
Selection mode (one required):
| Param | Description |
|---|---|
?day |
Today's word (deterministic, same for everyone). Accepts a negative
integer offset for past days: ?day=-1 for yesterday,
?day=-7 for a week ago, etc. Future days (positive
offsets) are rejected.
|
?random |
Random word |
?seed=X |
Seeded random (deterministic for a given seed) |
?seed=X&day |
Seeded daily word (different seeds = different daily words) |
Filters (optional):
| Param | Description |
|---|---|
?theme=animal |
Filter by theme (use + for multiple:
animal+plant). Defaults to all themes except
nonsense.
|
?length=5 |
Exact letter count (3–12) |
?minlength=3 |
Minimum letter count (3–12) |
?maxlength=6 |
Maximum letter count (3–12) |
?difficulty=2 |
Filter by difficulty (1–5, or range: 1-3) |
?syllables=2 |
Filter by syllable count (or range: 1-3) |
?etymology=latin |
Filter by root language (case-insensitive) |
Response fields:
| Field | Description |
|---|---|
word |
The selected word |
day |
Day of the year (1–366). Present for ?day and
?seed=X&day modes only.
|
epoch_day |
Days since 2025-01-01 (stable counter used for selection). Present for
?day and ?seed=X&day modes only.
|
pool |
Number of candidate words matching the filters |
Extras (optional, comma-separated or all):
| Param | Description |
|---|---|
?extra=taxonomy |
Biological taxonomy (animal/plant) |
?extra=definition |
Short dictionary definition |
?extra=etymology |
Root language |
?extra=ipa |
IPA pronunciation |
?extra=syllables |
Syllable count |
?extra=pos |
Part of speech |
?extra=difficulty |
Difficulty rating (1–5) |
?extra=all |
All of the above |
Examples:
GET /?day&theme=general&length=5&difficulty=1-2
{"word":"about","day":93,"epoch_day":458,"pool":232}
GET /?day&theme=general&length=5&extra=all
{"word":"abide","day":93,"epoch_day":458,"pool":374,"definition":"to accept or tolerate","etymology":"Old English","ipa":"əˈbaɪd","syllables":2,"pos":"verb","difficulty":2}
GET /?day&theme=animal&maxlength=6
{"word":"crane","day":93,"epoch_day":458,"pool":312}
GET /?seed=myapp&day&theme=plant&extra=taxonomy
{"word":"daisy","day":93,"epoch_day":458,"pool":44,"taxonomy":["Plantae","Tracheophyta","Magnoliopsida","Asterales","Asteraceae","Bellis"]}
GET /?random&theme=animal&length=5
{"word":"eagle","pool":62}
GET /?seed=level-42&theme=general&length=5
{"word":"stern","pool":374}
GET /dictionary[?starts_with=a]
Returns all known English words as a JSON array of strings, sorted alphabetically. Intended for client-side word validation (e.g. checking if a guess is a real word).
| Param | Description |
|---|---|
?starts_with=z |
Filter to words beginning with this prefix (case-insensitive) |
GET /dictionary?starts_with=zz
["zzz"]
GET /dictionary?starts_with=cat
["cat","catachresis","cataclasm","cataclysm",...]
GET /lookup/{word}[?filters&extra=all]
Check if a word exists, which themes it belongs to, and get its metadata.
Accepts the same filters as the main endpoint — returns
404 if the word is not in the filtered pool.
GET /lookup/eagle?extra=all
{"themes":["animal"],"definition":"a large bird of prey","etymology":"Old English","ipa":"ˈiː.ɡəl","syllables":2,"pos":"noun","difficulty":2,"taxonomy":["Animalia","Chordata","Aves","Accipitriformes","Accipitridae"]}
GET /lookup/eagle?theme=animal&length=5
{"themes":["animal"]}
GET /lookup/eagle?theme=plant
404 {"error":"word 'eagle' not in filtered pool"}
GET /list[?theme=animal&length=5&difficulty=1-2]
Returns all words matching the given filters as a JSON array. Accepts the same filters as the main endpoint.
GET /list?theme=animal&length=5
["adder","bison","camel","cobra","crane","eagle","finch","gecko","goose",...]
GET /themes
Returns available themes with word counts and available lengths.
GET /themes
[{"theme":"general","count":3808,"lengths":[3,4,5,6,7,8,9,10,11,12]},...]
When no ?theme is specified, all themes except
nonsense are included.
| Theme | Description |
|---|---|
general |
Common English words |
animal |
Animals (with taxonomy data) |
plant |
Plants (with taxonomy data) |
food |
Foods and ingredients |
colour |
Colour names |
place |
Geographic/landscape words |
body |
Body parts |
nonsense |
Convincing fake words (excluded from default pool) |
All words avoid regional spelling variants (no colour/color
ambiguity) and are sourced from OED and Merriam-Webster definitions. The
nonsense theme contains plausible-sounding words that do not
exist in any dictionary.
A pool warning header (Warning: 299) is returned when the
filtered candidate pool has fewer than 365 words, indicating that words
will repeat within a year.