Puzzle API, files not a serverBratislavaVersion 1
Free logic puzzles for your website, bulletin or app.
Six thousand puzzles in ten kinds, from Killer Sudoku to Nonograms, each checked by our own solver for exactly one solution. Take one as a puzzle people solve on your page, as a picture to print, or as plain data for your code.
No key, no sign-up, no account. Free for anything you do not sell, with one line of credit next to the puzzle.
- Kinds of puzzle10
- Difficultieseasy, medium, hard
- Puzzles in all6000
- Checked for exactly one solutionevery one
- Costfree with a credit line
Not a picture: tap the grid and solve it. This is the widget you can put on your own page.
Three ways to use it, three steps each.
Pick the one that sounds like you. Each ends with something you can see on your page or hold on paper.
Put a puzzle on your website
For a school page, a club site or a blog.
- Pick a puzzle in the explorer below.
- Copy the iframe code under it.
- Paste it into a Custom HTML block in WordPress, or wherever your site takes HTML.
You get a puzzle your visitors solve right on your page, with Check and Show solution, and the credit line already in it.
Get the codePrint a puzzle in your bulletin
For a parish sheet, a class worksheet or a club newsletter.
- Pick a kind and a difficulty that suit your readers.
- Download the puzzle, and the solution for the next issue.
- Insert the file as a picture and put the credit line under it.
You get black lines that stay sharp at any size, ready for Word in Microsoft 365, LibreOffice or Canva, with the rules to print beside them.
Download a puzzleLoad a puzzle in your app
For a developer: a game, a bot, a lesson tool.
- Fetch one JSON file, from any domain and with no key.
- Read the clues from
givensorgridand the answer fromsolution. - Show the credit line next to the puzzle.
You get a puzzle with exactly one solution, in a file under 2 KB that keeps its content once published.
Run the codePick a puzzle and see every file behind it.
Choose a kind, a difficulty and a number. The drawings, the address and the JSON below are the real files, loaded live from this site.
otters-easy-001: a Slitherlink puzzle, 5 by 5.
001.svg001-solution.svgBlack lines on a transparent background, with no fixed size: the drawings take the width you give them and print sharply at any of them.
The rules, ready to print under the puzzle
- Draw one closed loop along the grid lines. The otters need a single river: no branches, no crossings, no second loop.
- A number in a patch counts its sides. It says how many of that patch’s four sides the river runs along, from 0 to 3. A patch with no number says nothing at all.
- Exactly one loop fits every number. A cross on a side is your own note that the side stays dry.
The address of the JSON file
https://arling.sk/api/puzzles/v1/otters/easy/001.json
The puzzle the daily game shows today is at /api/puzzles/v1/today/otters.json, rewritten every night.
What is inside, 743 bytes, shown one field per line
{
"v": 1,
"kind": "otters",
"difficulty": "easy",
"id": "otters-easy-001",
"seed": "api-v1:otters:easy:1:5",
"size": 5,
"rules": "Slitherlink. Full rules: https://arling.sk/games/otters/guide/",
"givens": [0, null, 3, null, null, null, null, 0, null, 3, null, null, null, null, null, 0, 0, null, null, 1, null, null, null, 1, 0],
"solution": {
"h": [0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
"v": [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0]
},
"verified": { "uniqueSolution": true, "solverMs": 1 },
"licence": {
"free": "personal and non-commercial use with the credit line Puzzle by ARLing, arling.sk",
"commercial": "Puzzle Post Bulletin Pro subscription",
"url": "https://arling.sk/puzzle-post/bulletin/"
},
"svg": { "puzzle": "001.svg", "solution": "001-solution.svg" }
}
Every field, with its value in this file
v1- The schema version. It stays 1: a change that would break your code gets a new folder, v2, and v1 stays where it is.
kindotters- Our name for the kind. Otters are Slitherlink puzzles.
difficultyeasy- easy, medium or hard. index.json lists the grid sizes of each.
idotters-easy-001- Kind, difficulty and number in one string. The widget takes it as id.
seedapi-v1:otters:easy:1:5- The exact key the puzzle was generated from, so the file can be rebuilt byte for byte. You never need it.
size5- n, the side of the grid: this one is 5 by 5.
rulesSlitherlink. Full rules: https://arling.sk…- The puzzle type and a link to the full rules, written for players.
givens25 values- Every patch, n × n in reading order: 0 to 3 for a numbered patch, null for a patch with no number.
solution{ h: [30], v: [30] }- h and v are the horizontal and the vertical pieces of grid line, in reading order: 1 where the river runs, 0 where it does not.
verified{ uniqueSolution: true, solverMs: 1 }- uniqueSolution is true in every file: a puzzle that failed the check was never written. solverMs is how long the check took, in milliseconds.
licence{ free: "…", commercial: "…", url: "…" }- Both licences, so the terms travel with the file: free with the credit line, commercial with Bulletin Pro.
svg001.svg, 001-solution.svg- The two drawings that sit next to this file: the puzzle and its solution.
Which fields a kind has: givens when its clues fit one flat array, grid when they do not, and some kinds have both. Point at a field to find it in the file.
Code you can copy, and run right here.
Every sample points at the puzzle you picked above, now otters-easy-001. Copy it as it is and it works; the ones that run in a browser you can try on this page first.
An iframe, for any page that takes HTML
Paste it into a Custom HTML block in WordPress, an embed box in Google Sites, or straight into your HTML. The puzzle is playable, shows the credit line and sets no cookies.
<iframe src="https://arling.sk/embed/puzzle/?kind=otters&difficulty=easy&id=otters-easy-001"
title="Slitherlink puzzle by ARLing" width="100%" height="620"
style="border:0" loading="lazy"
sandbox="allow-scripts allow-same-origin allow-popups"></iframe>
One line of script
It puts the same iframe where the tag stands, then keeps the frame as tall as the puzzle, so it never needs a scrollbar. For the daily puzzle instead, swap data-difficulty and data-id for data-date="today".
<script src="https://arling.sk/embed/puzzle/embed.js"
data-kind="otters" data-difficulty="easy"
data-id="otters-easy-001"></script>
A picture, no code at all
For a newsletter builder or a site that allows images but not frames. The white background keeps the black lines visible on a dark page.
<figure>
<img src="https://arling.sk/api/puzzles/v1/otters/easy/001.svg"
alt="Slitherlink puzzle" width="400"
style="background:#fff; max-width:100%; height:auto">
<figcaption><a href="https://arling.sk/">Puzzle by ARLing, arling.sk</a></figcaption>
</figure>
JavaScript, in a browser or in Node 18 and newer
It works from any domain, because every file is served with Access-Control-Allow-Origin: *. Run fetches the same file from this site and prints what each console.log prints.
const url = 'https://arling.sk/api/puzzles/v1/otters/easy/001.json';
fetch(url)
.then((response) => response.json())
.then((puzzle) => {
console.log(puzzle.id); // which puzzle this is
console.log(puzzle.rules); // the type and a link to the rules
console.log(puzzle.size); // the side of the grid
console.log(puzzle.verified.uniqueSolution); // true in every file
console.log(new URL(puzzle.svg.puzzle, url).href); // the drawing
});
curl, in a terminal
On Windows PowerShell, type curl.exe instead of curl.
# the puzzle as JSON curl -s https://arling.sk/api/puzzles/v1/otters/easy/001.json # the drawing and its answer, saved as 001.svg and 001-solution.svg curl -sO https://arling.sk/api/puzzles/v1/otters/easy/001.svg curl -sO https://arling.sk/api/puzzles/v1/otters/easy/001-solution.svg # all 200 puzzles of this kind and difficulty, with a sha256 for every file curl -s https://arling.sk/api/puzzles/v1/otters/easy/index.json
Python 3, standard library only
Nothing to install. It prints the id, the size and the check, and saves both drawings next to the script.
import json
import urllib.request
url = "https://arling.sk/api/puzzles/v1/otters/easy/001.json"
with urllib.request.urlopen(url) as response:
puzzle = json.load(response)
print(puzzle["id"], puzzle["size"])
print(puzzle["verified"]["uniqueSolution"])
# save the drawing and its answer next to this script
base = url.rsplit("/", 1)[0] + "/"
for name in puzzle["svg"].values():
urllib.request.urlretrieve(base + name, name)
We ran the JavaScript in Node 22, the Python in Python 3.13 and the curl lines against the live site on 24 September 2026.
What the widget tells your page
The frame posts a message when the puzzle appears and when somebody solves it. If your page asks for it, as the script tag does, it also reports its height whenever that changes. Nothing else leaves the frame.
window.addEventListener('message', (e) => {
if (e.origin !== 'https://arling.sk') return; // only our frame
const m = e.data;
if (!m || m.type !== 'arling-puzzle') return;
if (m.event === 'loaded') console.log('shown', m.id);
if (m.event === 'solved') console.log('solved', m.id); // say well done
});
Messages from the puzzles on this page, newest first
- Nothing yet. Solve the puzzle at the top of the page, or press Run on the iframe sample.
Four addresses, and that is the whole API.
There is no server behind this. Every address is a file, and fetching one is the same as fetching an image.
| Address | What is in it |
|---|---|
/api/puzzles/v1/index.json | The kinds, the difficulties, the counts, the grid sizes, the full rules of each kind and notes on every field. |
/api/puzzles/v1/<kind>/<difficulty>/<nnn>.json | One puzzle. The number runs from 001 to 200. Next to it sit <nnn>.svg, the puzzle, and <nnn>-solution.svg, the answer. |
/api/puzzles/v1/<kind>/<difficulty>/index.json | The 200 puzzles of that difficulty, with a sha256 for every file. |
/api/puzzles/v1/today/<kind>.json | The puzzle the daily game shows today, rewritten every night, with an extra date field. |
The ten kinds are badgers (Killer Sudoku), hares (Anti-knight Sudoku), squirrels (Kakuro), magpies (Nonograms), hedgehogs (Star Battle), otters (Slitherlink), cranes (Hashi), swans (Masyu), voles (Nurikabe) and herons (Numberlink). The three difficulties are easy, medium and hard.
The widget at /embed/puzzle/ takes kind, difficulty and id for a puzzle from these files, date=today for the daily puzzle, or seed= with any text for a puzzle generated in the visitor's own browser. Generated puzzles are not checked in advance the way the files are, so the files are the better source when you need the guarantee.
The files are built by ops/puzzle-api/postav.mjs in our repository and checked by the same script with --kontrola, which opens every file, compares it with the sha256 in the index and runs five puzzles per kind through the solver again.
Free to use, with one line of credit.
Use any puzzle on your own website, in your classroom, in a parish sheet or club newsletter you give away, or in a free app without ads. The one condition is this line next to the puzzle:
Puzzle by ARLing, arling.sk
A link on those words is welcome and not required. The widget shows the line itself, so with the widget there is nothing else to do.
Videos sent to TikTok from our Puzzle video maker need no credit line in the picture: TikTok does not allow apps to add branding to the videos they share. A credit in your caption is welcome and not required. Every other use keeps the credit line.
Selling is the line. A paid newsletter or magazine, or a site that earns from ads, needs the commercial licence. It comes with a Puzzle Post Bulletin Pro subscription, 39 € a month or 390 € a year, on the terms written on that page: one publication of yours, printed and on its website. Every JSON file repeats both licences in its licence field, so the terms travel with the file.
Not covered by either licence: passing the puzzles off as your own, selling them on their own or in a puzzle book or puzzle app, and republishing the files as a competing download. Not sure where you stand? Write to support@arling.sk before you print.
What people ask first.
Is it really free, and what do I have to do?
Yes, for anything you do not sell: a school or club website, a classroom worksheet, a parish sheet or newsletter you give away, a free app without ads. The one condition is the credit line Puzzle by ARLing, arling.sk next to the puzzle, and the widget already shows it. There is no key, no account and no sign-up.
Can I use the puzzles in something I sell?
Not under the free licence. The commercial licence comes with a Puzzle Post Bulletin Pro subscription, 39 € a month or 390 € a year, on the terms on the Bulletin page: one publication of yours, printed and on its website, whether you sell that publication or give it away. Selling the puzzles on their own, in a puzzle book or in a puzzle app is not covered by either licence, so write to support@arling.sk before you start.
How often are new puzzles added?
The numbered files are a fixed set of 6000, built on 17 September 2026 (the updated field in index.json), and a published file keeps its content; the index lists a sha256 for every file so you can check. We do not promise a date for more. What changes is today/<kind>.json: ten files, one per kind, rewritten every night with the puzzle the daily game shows. For new puzzles on a schedule, Puzzle Post Bulletin sends a finished sheet every Monday.
Is it safe to put on my site?
The widget runs in an iframe from arling.sk, so it cannot read your page and your page cannot read it. It sets no cookies, stores nothing in the browser and loads no analytics. Its own security policy lets it fetch only from arling.sk. The samples on this page also give the frame a sandbox: it may run its own scripts, keep its own origin and open links in a new tab, and it cannot navigate your page or submit forms. The JSON files are plain data, and none of the 12020 SVG files contains a script; we checked every one on 24 September 2026. If you listen for the widget's messages, check that e.origin is https://arling.sk.
Can I fetch the files from another domain (CORS)?
Yes. Every file is served with Access-Control-Allow-Origin: *, so fetch() works from any origin without a proxy and without credentials. We checked the header on 24 September 2026. Browsers may cache a file for 10 minutes (Cache-Control: max-age=600). From a server or a script there is no CORS question at all.
Do I need an API key? Is there a rate limit?
No key and no account. We set no quota of our own. The files are served by GitHub Pages, so its general usage limits apply to the site as a whole: fetch index.json once and cache what you take.
What does exactly one solution mean here?
Our own solver, the one that runs the daily games, found exactly one answer, and that answer matches every clue. A puzzle that failed either half of that check was never written. It is a program check, not a claim that the puzzle has never appeared anywhere else.
Something missing or wrong? Write to support@arling.sk.
Colophon
- Publisher
- ARLing s. r. o., Ivanská cesta 32E, 821 04 Bratislava, Slovakia. Company ID 56583486, VAT ID SK2122352100.
- Who makes it
- Andrej in Bratislava looks after the products and the support and answers at support@arling.sk. Our own program generates, checks and draws every puzzle.
- What it costs
- Nothing for anything you do not sell. The files are static and sit on the same host as this page, so there is no key and no sign-up.