{"openapi":"3.1.0","info":{"title":"Sudoku Play API","version":"0.1.0","description":"A fully local, playable 9x9 Sudoku engine with uniquely-solvable puzzle generation, real naked/hidden-single hint logic, and a full backtracking solver. Stateless: the caller holds the puzzle state between calls.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://sudokuplay.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/sudokuplay/docs"},"termsOfService":"https://connectorbay.com/sudokuplay/terms"},"servers":[{"url":"https://sudokuplay.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/sudokuplay/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/new_puzzle":{"post":{"operationId":"new_puzzle","summary":"Generate a new 9x9 Sudoku puzzle with a mathematically proven unique solution, at the requested","description":"Generate a new 9x9 Sudoku puzzle with a mathematically proven unique solution, at the requested\n    difficulty. Use for \"let's play sudoku\", \"give me a hard sudoku puzzle\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"difficulty":{"default":"medium","description":"'easy', 'medium', 'hard', or 'expert' (fewer givens = harder).","title":"Difficulty","type":"string"}},"title":"new_puzzleArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/set_cell":{"post":{"operationId":"set_cell","summary":"Fill or clear one cell. Rejected if the cell is a given clue, or if the value conflicts with a","description":"Fill or clear one cell. Rejected if the cell is a given clue, or if the value conflicts with a\n    digit already visible in the same row, column, or 3x3 box.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current puzzle state, exactly as returned by a previous call.","title":"State","type":"object"},"row":{"description":"Row index, 0-8.","maximum":8,"minimum":0,"title":"Row","type":"integer"},"col":{"description":"Column index, 0-8.","maximum":8,"minimum":0,"title":"Col","type":"integer"},"value":{"description":"Digit 1-9 to place, or 0 to clear the cell.","maximum":9,"minimum":0,"title":"Value","type":"integer"}},"required":["state","row","col","value"],"title":"set_cellArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_hint":{"post":{"operationId":"get_hint","summary":"Return one genuine logical deduction: a forced cell value and WHY it's forced (naked single,","description":"Return one genuine logical deduction: a forced cell value and WHY it's forced (naked single,\n    hidden single, or -- only if neither applies -- a solver-derived deeper deduction). Does not modify\n    the state; call set_cell yourself to apply it.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current puzzle state, exactly as returned by a previous call.","title":"State","type":"object"}},"required":["state"],"title":"get_hintArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/check_solution":{"post":{"operationId":"check_solution","summary":"Check whether the grid is complete and whether every row, column, and box is a valid","description":"Check whether the grid is complete and whether every row, column, and box is a valid\n    permutation of 1-9.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current puzzle state, exactly as returned by a previous call.","title":"State","type":"object"}},"required":["state"],"title":"check_solutionArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/solve":{"post":{"operationId":"solve","summary":"Run the full backtracking solver on the puzzle's original clues and return the unique answer","description":"Run the full backtracking solver on the puzzle's original clues and return the unique answer\n    grid -- for verification, or for a player who wants to see the solution.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current puzzle state, exactly as returned by a previous call.","title":"State","type":"object"}},"required":["state"],"title":"solveArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/render_board":{"post":{"operationId":"render_board","summary":"Render the current grid as human-readable text with 3x3 box separators.","description":"Render the current grid as human-readable text with 3x3 box separators.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"state":{"additionalProperties":true,"description":"Current puzzle state, exactly as returned by a previous call.","title":"State","type":"object"}},"required":["state"],"title":"render_boardArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/rules_info":{"post":{"operationId":"rules_info","summary":"Explain Sudoku's rules, the difficulty levels, and how hints and generation work.","description":"Explain Sudoku's rules, the difficulty levels, and how hints and generation work.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"rules_infoArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}