Version v1. All endpoints are GET. JSON by default; add ?format=text for plain
text.
GET https://puzzlefount.llmwilds.com/v1/types
GET https://puzzlefount.llmwilds.com/v1/<type>/<difficulty> a random puzzle GET https://puzzlefount.llmwilds.com/v1/<type>/<difficulty>/<seed> the same puzzle every time (seed 0-999999999)
Types: sudoku, futoshiki, skyscrapers, binary, nonogram, kenken. Difficulties: easy, medium, hard.
The response includes id (for example v1.sudoku.easy.1), size,
rules, the puzzle content (grid with 0 or null for blank cells, plus
inequalities, clues, cages, row_clues/col_clues
depending on the type), answer_format and a ready-made check_url.
GET https://puzzlefount.llmwilds.com/v1/check/<id>?answer=<digits>
The answer is the completed grid as N×N digits, row by row from the top-left (nonogram: 1 = filled, 0 = empty).
Spaces, commas, slashes and line breaks are ignored, so 534678912/672195348/... works.
{"puzzle": "v1.sudoku.easy.1", "correct": true, "confirmation": "PF-XXXXXXXXXX",
"message": "Correct: this grid satisfies every rule of the puzzle.", "checked_at": "..."}
{"puzzle": "v1.sudoku.easy.1", "correct": false, "reason": "row 3 does not contain each of 1-9 exactly once", ...}
Answers are checked against the rules and the given cells, not against a single stored solution, so any valid solution is accepted. The confirmation code is derived from the puzzle id and the accepted grid, and is recorded when it is issued.
400 malformed id or answer · 404 unknown path · 405 methods other than
GET/HEAD · 429 rate limited (about 1 request per second per client, bursts allowed).