Sudoku-Rätsel-API

Ein kostenloser JSON-Endpunkt, der auf Anfrage ein neues Sudoku-Rätsel liefert. Keine Anmeldung, kein Schlüssel, 60 Anfragen pro Stunde und IP. Geeignet für Tutorials, Beispielanwendungen oder überall, wo ein Rätsel ohne eigenen Generator gebraucht wird.

Schnellstart

Ein GET-Request. Die Antwort enthält Rätsel und Lösung als 81 Zeichen lange Zeichenketten und den verwendeten Seed.

curl 'https://api.sudokumountain.com/v1/generate?mode=classic&difficulty=easy'

Endpunkte

GET /v1/generate
Rätsel erzeugen.
GET /v1/health
Verfügbarkeitsprüfung.

Parameter

mode
Erforderlich. In v1 nur `classic`. Killer wartet auf eine Erweiterung des Antwortformats um Käfigdaten.
difficulty
Erforderlich. Eines aus: easy, medium, hard, expert, master, extreme. Die sechs Stufen entsprechen der Spielseite.
seed
Optional. Nichtnegative Ganzzahl bis 4.294.967.295. Derselbe Seed liefert in derselben Engine-Version dasselbe Rätsel — nützlich für Tests oder stabile Seitenbeispiele.

Antwort

Rätsel und Lösung sind 81 Zeichen lange Zeichenketten, von links nach rechts und oben nach unten gelesen. Jedes Zeichen ist eine Ziffer 1–9 — im Rätsel steht zusätzlich '0' für ein leeres Feld.

{
  "puzzle":     "530070000600195000098000060800060003400803001700020006060000280000419005000080079",
  "solution":   "534678912672195348198342567859761423426853791713924856961537284287419635345286179",
  "mode":       "classic",
  "difficulty": "easy",
  "seed":       1734567890
}
puzzle
81 Zeichen lange Zeichenkette. '0' steht für ein leeres Feld, '1'–'9' für ein vorgegebenes.
solution
81 Zeichen lange Zeichenkette. Die eindeutige Lösung des Rätsels.
mode
Spiegelt den Modus der Anfrage. In v1 immer `classic`.
difficulty
Spiegelt die angefragte Schwierigkeit.
seed
Der tatsächlich verwendete Seed. Entspricht dem in der Anfrage, sofern angegeben; sonst eine zufällige 32-Bit-Ganzzahl.

JavaScript

const res = await fetch(
  'https://api.sudokumountain.com/v1/generate?mode=classic&difficulty=medium',
);
const puzzle = await res.json();
console.log(puzzle.puzzle);    // 81-char string, '0' = empty
console.log(puzzle.solution); // 81-char string, all 1–9

Python

import urllib.request, json

url = "https://api.sudokumountain.com/v1/generate?mode=classic&difficulty=hard"
with urllib.request.urlopen(url) as r:
    puzzle = json.load(r)

print(puzzle["puzzle"])    # 81-char string, '0' = empty
print(puzzle["solution"]) # 81-char string, all 1–9

curl — health

curl 'https://api.sudokumountain.com/v1/health'

Anfragelimits

60 Anfragen pro Stunde und IP. Jede Antwort enthält X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset (Unix-Sekunden, wann das Fenster zurückgesetzt wird). Bei Überschreitung gibt es einen 429 mit Retry-After-Header.

Fehler

Fehler werden als application/json mit `error`-Code und menschenlesbarer `message` zurückgegeben. Die Codes sind stabil und können sicher in switch-Anweisungen verwendet werden:

400
invalid-mode, invalid-difficulty oder invalid-seed. Die Meldung beschreibt das Problem.
429
rate-limit-exceeded. Nach den Sekunden in Retry-After (oder X-RateLimit-Reset) erneut versuchen.
500
generation-failed. Selten. Mit anderem Seed oder ohne Seed wiederholen.
503
rate-limit-unavailable. Der Zähler ist offline. In ein paar Sekunden erneut versuchen.

Versionierung

v1 ist stabil. Breaking Changes erscheinen unter v2, v1 bleibt dauerhaft erreichbar. Neue optionale Parameter und zusätzliche Felder in der Antwort sind keine Breaking Changes — schreiben Sie Parser, die unbekannte Felder ignorieren.

Nutzung

Kostenlos für jede Nutzung, kommerziell oder privat. Eine Erwähnung ist nett, aber nicht erforderlich. Wenn Sie etwas Schönes damit bauen, freuen wir uns über eine Nachricht.

Verwandt