Filter Wordle candidate words by green, yellow and gray clues
Turn Wordle feedback into a shorter, reliable candidate list without guessing which clue should take priority.
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Supply words of one shared length, then describe each green, yellow, and gray tile with its letter and zero-based position. The filter checks every word deterministically, preserves the original list order, and handles the important case where an extra copy of a letter is gray even though another copy is green or yellow. The result is ready for manual play, testing, or a larger solving workflow.
Describe the board as precise position clues
Start with a candidate dictionary in which every entry has the same length. Each feedback tile is represented by a letter and a zero-based position, so the first square is position 0, the second is position 1, and so on. Add green records for letters that must occupy exact positions. Add yellow records for letters that must occur somewhere in the answer but cannot occupy the recorded positions. Add gray records for letters rejected by the game. This structure is more dependable than three unpositioned strings because it preserves what each tile actually proved. It also lets the filter distinguish two clues involving the same letter. Words are compared without regard to uppercase or lowercase, but matching results retain the spelling and order supplied in the original list. All dictionary entries must contain only English letters and share a length; mixed lengths usually indicate that lists for different puzzle sizes were combined accidentally, so the request is rejected instead of silently discarding part of the data.
Understand repeated letters and contradictions
Repeated letters are where simple Wordle filters often produce incorrect results. A gray tile normally means that its letter is absent. However, a guess can contain a letter twice while the answer contains it once: one copy may be green or yellow and the extra copy gray. This filter recognizes that exception when positive and gray feedback for the same letter comes from different positions. In that case, positive clues establish the required count and the gray occurrence caps the candidate at that count. If the same letter is reported as positive and gray at the same position, there is no positional evidence for an extra copy, so the input is contradictory and returns an error. Multiple distinct positive positions require multiple occurrences. The filter also rejects two different green letters assigned to one position and rejects a yellow letter assigned to a position where that same letter is green. These checks expose transcription mistakes early, before an impossible clue set misleadingly returns an empty candidate list.
Use the filtered list in a solving workflow
The response includes the matching candidates, the number of matches, the number of supplied words, and the shared word length. A zero count is a valid result when the clues are internally coherent but no supplied word satisfies them; it is different from an invalid request, which reports a typed input error. After each guess, add the new tile evidence and run the filter again. You can inspect the remaining words directly, feed them to a separate ranking method, or compare different dictionaries while keeping the feedback constant. The filter deliberately does not assign scores or recommend an optimal next guess, because ranking depends on strategy, allowed-guess rules, and the chosen answer corpus. Its narrower job is to make the candidate set correct and reproducible. Execution is local and deterministic, with no network calls, random choices, or changing external dictionary. Browser use is convenient for individual puzzles, while the API costs $0.002 per request when you automate test cases, game analysis, or educational tools.
What you can do with it
Narrow a daily puzzle
Apply the colored feedback from completed guesses to a personal answer list and inspect only consistent words.
Test a Wordle clone
Compare a game's feedback and candidate behavior against deterministic fixtures, including duplicate-letter cases.
Prepare candidates for ranking
Produce a validated candidate set before a separate entropy, frequency, or letter-coverage strategy scores the next guess.
FAQ
Are positions zero-based?
Yes. Position 0 is the first letter, position 1 is the second, and positions must fall within the shared word length.
How are repeated gray letters handled?
A gray letter is absent unless the same letter has positive feedback at a different position. That repeated-letter case caps the permitted copies at the positive count.
Why did I get an error instead of zero candidates?
An error means the input itself is malformed or contradictory. Zero candidates means the clues are valid but no word in the supplied list matches them.
Can the word list contain different lengths?
No. Every word must have one shared length so that each positional clue has a single unambiguous meaning.
What does API use cost?
Each API request costs $0.002. The same deterministic filtering logic can also run in the browser.
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/game/wordle-solver-filter \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"word_list":["cigar","cider","caper","coven","cynic","rebut"]}'const res = await fetch("https://api.kit.forhosting.com/game/wordle-solver-filter", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"word_list": [
"cigar",
"cider",
"caper",
"coven",
"cynic",
"rebut"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/game/wordle-solver-filter",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"word_list": [
"cigar",
"cider",
"caper",
"coven",
"cynic",
"rebut"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/game/wordle-solver-filter", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"word_list":["cigar","cider","caper","coven","cynic","rebut"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"word_list":["cigar","cider","caper","coven","cynic","rebut"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/game/wordle-solver-filter", 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_list": [
"cigar",
"cider",
"caper",
"coven",
"cynic",
"rebut"
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "game.wordle_solver_filter",
"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.
Limits
max_items | 50000 |
max_word_length | 32 |
max_constraints | 128 |
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. |