Eén POST per activiteitstype. Stuur je inhoud als JSON en je krijgt een activiteit in je Puzzel.org-account terug, plus een URL die je aan spelers kunt geven of in een iframe kunt zetten.
Base URL
https://puzzel.org/api/public/v1
Auth
Sleutel + e-mailadres in de body
Endpoints
20 activiteitstypen
Quotum
10 activiteiten per dag
Je eerste request
Niets te installeren en geen handshake: post een JSON-body met je sleutel, je e-mailadres en je inhoud. Het antwoord bevat de key van de nieuwe activiteit en de URL waarop die gespeeld wordt.
POST crossword
curl -X POST https://puzzel.org/api/public/v1/crossword \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Crossword",
"language": "nl",
"items": [
{
"answer": "BANANA",
"description": "A long yellow fruit",
"type": "text"
},
{
"answer": "CHERRY",
"description": "A small red stone fruit",
"type": "text"
},
{
"answer": "MELON",
"description": "Big, green outside, sweet inside",
"type": "text"
}
]
}'
Elk voorbeeld op deze pagina is een compleet, uitvoerbaar request. Vul je eigen sleutel en inhoud in en het werkt meteen.
Authenticatie
Er zijn geen headers en geen bearer token. Beide gegevens reizen mee in de JSON-body van elk request, en de sleutel wordt alleen geaccepteerd voor het account waar dat e-mailadres bij hoort.
Veld
Type
Wat het doet
account_api_key
verplicht
string
string
De API-sleutel van je account. Die gaat in de body, niet in een header.
email
verplicht
string
string
Het e-mailadres waarmee je Puzzel.org-account inlogt. De sleutel is alleen geldig in combinatie hiermee.
Je sleutel staat in het accountgedeelte van je dashboard, achter Tonen.
Behandel de sleutel als een wachtwoord. Hij maakt en overschrijft activiteiten in je account, dus houd hem server-side en buiten alles wat een browser kan lezen.
De request-body
Elk endpoint neemt dezelfde vijf velden. Wat verschilt is het inhoudsveld eronder: de meeste nemen een array van items, een paar nemen één zin of één afbeelding, en sudoku neemt helemaal niets.
Veld
Type
Wat het doet
account_api_key
verplicht
string
string
De API-sleutel van je account. Die gaat in de body, niet in een header.
email
verplicht
string
string
Het e-mailadres waarmee je Puzzel.org-account inlogt. De sleutel is alleen geldig in combinatie hiermee.
title
optioneel
string
string
De naam die de activiteit in je dashboard krijgt. Laat je hem weg, dan gebruikt het endpoint zijn eigen standaardnaam.
language
optioneel
string
string
Bepaalt alleen de taal in de URL die je terugkrijgt — er wordt niets vertaald van wat je stuurt. De woordzoeker leest het ook om zijn vulletters op Arabisch te zetten als het "ar" is.
Standaard: "en"
activity_key
optioneel
string
string
Laat je dit weg, dan wordt er een nieuwe activiteit gemaakt. Stuur je de key van een activiteit die je al bezit, dan wordt die in plaats daarvan opnieuw opgebouwd.
settings is een object met opties per endpoint. Welke een endpoint leest staat er hieronder bij vermeld; al het andere dat je erin zet wordt genegeerd.
Wat je terugkrijgt
Een geslaagde aanroep antwoordt met 200, de key van de nieuwe activiteit en de URL waarop die gespeeld wordt. Al het andere antwoordt met success op false en één foutmelding als string.
{
"success": false,
"error": "Invalid Email or API Key"
}
De url die je terugkrijgt is de insluitweergave. Vervang embed door play om hem paginavullend te openen, of door build om hem in de editor te openen — de key achter p= blijft hetzelfde.
Aanmaken versus bijwerken
Stuur activity_key mee en de bijbehorende activiteit wordt ter plekke opnieuw opgebouwd: de inhoud wordt vervangen, de naam en het versiestempel worden ververst, en de key zelf blijft hetzelfde — dus links en insluitingen die je al gedeeld hebt blijven werken. Resultaten, de map waarin de activiteit staat en elke instelling die het endpoint zelf niet schrijft blijven zoals ze waren.
activity_key
{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"activity_key": "-Nq8sample_activity_key",
"title": "Fruit crossword, week 2",
"items": [
{
"answer": "BANANA",
"description": "A long yellow fruit",
"type": "text"
},
{
"answer": "CHERRY",
"description": "A small red stone fruit",
"type": "text"
},
{
"answer": "MELON",
"description": "Big, green outside, sweet inside",
"type": "text"
}
]
}
title wordt bij elke update toegepast, ook de standaardwaarde — laat je hem weg, dan wordt de activiteit hernoemd naar de standaardnaam van dat endpoint.
De instellingenblokken die een endpoint zelf schrijft worden helemaal opnieuw opgebouwd, dus een update zet die ook terug naar de waarden die je stuurt, of naar de standaardwaarden van het endpoint.
Je kunt alleen activiteiten bijwerken die je eigen account bezit. De key van iemand anders antwoordt met 403.
Een update kost hetzelfde als een aanmaak: één aanroep van het quotum van vandaag.
Rate limit
10
10 activiteiten per account per dag
Elke geslaagde aanroep telt mee, aanmaken en bijwerken allebei. Ga je eroverheen, dan antwoordt het volgende request met 429 tot de teller is gewist.
De teller wordt één keer per dag gewist door een geplande taak, niet op basis van een voortschrijdend venster van 24 uur.
Fouten
Fouten komen altijd binnen als JSON met dezelfde twee velden, nooit als een HTML-pagina. De error-string is geschreven om door een mens gelezen te worden — hij noemt het veld of de limiet waar het misging.
Status
Wat het betekent
400
Bad Request
Er ontbreekt iets in de body, of het is verkeerd gevormd of buiten bereik. De melding noemt het veld.
401
Unauthorized
Het e-mailadres is onbekend, of de sleutel hoort niet bij dat account.
403
Forbidden
De activity_key die je stuurde hoort bij een ander account.
429
Too Many Requests
Het quotum van vandaag is op. Het wordt één keer per dag gewist.
500
Server Error
De generator kon geen puzzel maken van wat je stuurde — meestal te weinig woorden, of woorden die niet in elkaar passen.
Endpoints
Eén pad per activiteitstype, allemaal POST, allemaal onder dezelfde base URL. Bij elk staat welke inhoud het nodig heeft, welke instellingen het leest en een request dat je kunt uitvoeren.
Woorden & letters
F
I
G
A
T
R
I
P
M
Kruiswoordpuzzel
Vlecht je antwoorden in elkaar tot een raster en nummert de omschrijvingen voor je.
Een array van woorden. Elk item koppelt het antwoord aan de omschrijving die ernaar verwijst.
Valt terug op de naam “Crossword API”
Goed om te weten
Antwoorden korter dan twee tekens worden weggelaten voordat het raster wordt gebouwd, en er moeten er minstens twee overblijven.
Antwoorden worden in hoofdletters gezet en de generator krijgt twintig pogingen om ze te plaatsen. Lukt het niet om ook maar één woord te plaatsen, dan antwoordt de aanroep met 500.
Voorbeeldrequest
POST crossword
curl -X POST https://puzzel.org/api/public/v1/crossword \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Crossword",
"language": "nl",
"items": [
{
"answer": "BANANA",
"description": "A long yellow fruit",
"type": "text"
},
{
"answer": "CHERRY",
"description": "A small red stone fruit",
"type": "text"
},
{
"answer": "MELON",
"description": "Big, green outside, sweet inside",
"type": "text"
}
]
}'
Een array van woorden. De omschrijvingstekst wordt de woordenlijst waar spelers mee werken.
Valt terug op de naam “Wordseeker API”
Goed om te weten
Antwoorden korter dan twee tekens worden weggelaten, en elk antwoord wordt in hoofdletters gezet voordat het het raster ingaat.
Het raster wordt opgevuld met Latijnse letters, tenzij language "ar" is — dan worden de vulletters Arabisch.
Instellingen die het leest
Veld
Type
Wat het doet
hidden_solution
optioneelin settings
string
string
De overgebleven letters vormen dit woord. Als je dit instelt, plaatst de generator eerst de oplossing in plaats van zoveel mogelijk woorden te proppen.
directions
optioneelin settings
string[]
string[]
In welke richtingen een woord mag lopen. Laat je dit weg, dan lopen woorden alleen naar rechts, schuin rechtsonder en naar beneden.
Een vanwesteastnorthsouthnorthwestnortheastsouthwestsoutheast
Standaard: ["east", "southeast", "south"]
template
optioneelin settings
string
string
Snijdt het raster in een vorm in plaats van het vierkant te laten.
Een vansquarecirclecrossdiamondpyramidsmileystarcross_plus
Voorbeeldrequest
POST wordseeker
curl -X POST https://puzzel.org/api/public/v1/wordseeker \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Wordseeker",
"language": "nl",
"items": [
{
"answer": "BANANA",
"description": "A long yellow fruit",
"type": "text"
},
{
"answer": "CHERRY",
"description": "A small red stone fruit",
"type": "text"
},
{
"answer": "MELON",
"description": "Big, green outside, sweet inside",
"type": "text"
}
],
"settings": {
"hidden_solution": "FRUIT",
"directions": [
"east",
"south",
"southeast"
],
"template": "square"
}
}'
Een array van woorden. Samen moeten ze elke letter van het verborgen woord leveren.
Valt terug op de naam “Acrostic API”
Goed om te weten
Als de antwoorden niet de letters kunnen leveren die de oplossing nodig heeft, antwoordt de aanroep met 500 in plaats van een half opgebouwd raster op te slaan.
De generator zet je antwoorden in een andere volgorde om de kolom te laten kloppen, dus de volgorde die je stuurt is niet de volgorde die spelers zien.
Instellingen die het leest
Veld
Type
Wat het doet
hidden_solution
verplichtin settings
string
string
Het woord dat de gemarkeerde kolom vormt. Zonder dit doet dit endpoint niets.
Voorbeeldrequest
POST acrostic
curl -X POST https://puzzel.org/api/public/v1/acrostic \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Acrostic",
"language": "nl",
"items": [
{
"answer": "PEACH",
"description": "Fuzzy skin, sweet flesh",
"type": "text"
},
{
"answer": "BANANA",
"description": "A long yellow fruit",
"type": "text"
},
{
"answer": "CHERRY",
"description": "A small red stone fruit",
"type": "text"
},
{
"answer": "MELON",
"description": "Big, green outside, sweet inside",
"type": "text"
}
],
"settings": {
"hidden_solution": "PLUM"
}
}'
POST/api/public/v1/word-scrambleMinimaal 1 in items
Inhoud
api_c_word_scramble
Valt terug op de naam “Word Scramble API”
Goed om te weten
Activiteiten die via de API zijn gemaakt hebben de instelling voor willekeurige volgorde altijd aan, dus de volgorde die je stuurt is niet de volgorde die spelers krijgen.
Instellingen die het leest
Veld
Type
Wat het doet
hidden_solution
optioneelin settings
string
string
Een optioneel bonuswoord dat spelers invullen zodra de rest is opgelost.
Voorbeeldrequest
POST word-scramble
curl -X POST https://puzzel.org/api/public/v1/word-scramble \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Word Scramble",
"language": "nl",
"items": [
{
"answer": "BANANA",
"description": "A long yellow fruit",
"type": "text"
},
{
"answer": "CHERRY",
"description": "A small red stone fruit",
"type": "text"
},
{
"answer": "MELON",
"description": "Big, green outside, sweet inside",
"type": "text"
}
],
"settings": {
"hidden_solution": "FRUIT"
}
}'
POST/api/public/v1/typing-practiceMinimaal 1 in items
Inhoud
api_c_typing_practice
Valt terug op de naam “Typing Practice API”
Voorbeeldrequest
POST typing-practice
curl -X POST https://puzzel.org/api/public/v1/typing-practice \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Typing Practice",
"language": "nl",
"items": [
{
"answer": "The quick brown fox jumps over the lazy dog",
"description": "Every letter of the alphabet",
"type": "text"
},
{
"answer": "Pack my box with five dozen liquor jugs",
"description": "Another pangram",
"type": "text"
}
]
}'
Geslaagd
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/typing-practice/embed?p=-Nq8sample_activity_key",
"message": "Typing Practice created successfully"
}
Een array van paren. Elk paar bevat de twee kaarten die bij elkaar horen.
Valt terug op de naam “Memory Game API”
Goed om te weten
Een kaart is een object met een type en een value. Gebruik "text" voor woorden, of "image", "audio", "youtube" of "link" met een URL in value, en voeg alt toe voor een beschrijving.
POST/api/public/v1/matching-pairsMinimaal 2 in items
Inhoud
api_c_matching_pairs
Valt terug op de naam “Matching Game API”
Goed om te weten
Een kaart is een object met een type en een value. Gebruik "text" voor woorden, of "image", "audio", "youtube" of "link" met een URL in value, en voeg alt toe voor een beschrijving.
Het endpoint slaat zoveel kaarten op als je stuurt, dus stuur er precies twee per item — eerst de voorkant, dan de achterkant.
Een kaart is een object met een type en een value. Gebruik "text" voor woorden, of "image", "audio", "youtube" of "link" met een URL in value, en voeg alt toe voor een beschrijving.
Een array van categorieën, elk met een naam en de kaarten die erin horen.
Valt terug op de naam “Categorize Game API”
Goed om te weten
Een categorie die zonder naam wordt gestuurd, wordt opgeslagen als “Untitled Category”, dus stuur er altijd een mee.
Een kaart is een object met een type en een value. Gebruik "text" voor woorden, of "image", "audio", "youtube" of "link" met een URL in value, en voeg alt toe voor een beschrijving.
Een array van reeksen. Elke reeks bevat zijn kaarten in de juiste volgorde.
Valt terug op de naam “Reorder Game API”
Goed om te weten
De volgorde die je stuurt wordt opgeslagen als de juiste volgorde — nummer één eerst.
Een kaart is een object met een type en een value. Gebruik "text" voor woorden, of "image", "audio", "youtube" of "link" met een URL in value, en voeg alt toe voor een beschrijving.
Een array van vragen. Meerkeuzevragen bevatten hun antwoordopties; open vragen bevatten het antwoord dat je goedkeurt.
Valt terug op de naam “Quiz API”
Goed om te weten
question_type is óf "multiple_choice", waarbij de juiste optie isCorrect true heeft, óf "open_answer", dat in plaats daarvan correct_answer gebruikt. Weggelaten wordt het als meerkeuze behandeld.
Het quiz-endpoint geeft settings rechtstreeks door als instellingenblokken van de activiteit, dus dit is geen plek voor losse opties — stel de quiz achteraf bij in de editor.
Voorbeeldrequest
POST quiz
curl -X POST https://puzzel.org/api/public/v1/quiz \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Quiz",
"language": "nl",
"items": [
{
"question_type": "multiple_choice",
"description": "Which fruit is yellow?",
"answers": [
{
"type": "text",
"description": "Banana",
"isCorrect": true
},
{
"type": "text",
"description": "Cherry",
"isCorrect": false
}
]
},
{
"question_type": "open_answer",
"description": "What colour is a lemon?",
"correct_answer": "Yellow",
"explanation": "Lemons ripen from green to yellow."
}
]
}'
question_type is óf "multiple_choice", waarbij de juiste optie isCorrect true heeft, óf "open_answer", dat in plaats daarvan correct_answer gebruikt. Weggelaten wordt het als meerkeuze behandeld.
Instellingen die het leest
Veld
Type
Wat het doet
number_of_tiles
optioneelin settings
number
number
Hoeveel vakjes het bord heeft. Tussen 10 en 75.
Standaard: 30
game_mode
optioneelin settings
string
string
Of spelers naar de finish racen of onderweg voorwerpen verzamelen.
Een vanrace_to_finishcollect_items
Standaard: "race_to_finish"
Voorbeeldrequest
POST board-game
curl -X POST https://puzzel.org/api/public/v1/board-game \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Board Game",
"language": "nl",
"items": [
{
"question_type": "multiple_choice",
"description": "Which fruit is yellow?",
"answers": [
{
"type": "text",
"description": "Banana",
"isCorrect": true
},
{
"type": "text",
"description": "Cherry",
"isCorrect": false
}
]
},
{
"question_type": "open_answer",
"description": "What colour is a lemon?",
"correct_answer": "Yellow",
"explanation": "Lemons ripen from green to yellow."
}
],
"settings": {
"number_of_tiles": 30,
"game_mode": "race_to_finish"
}
}'
Geslaagd
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/board-game/embed?p=-Nq8sample_activity_key",
"message": "Board Game created successfully"
}
Eén zin, in het veld sentence. Dit endpoint neemt geen items.
Valt terug op de naam “Calculation Game API”
Goed om te weten
Als de beperkingen te strak zijn om de zin te coderen, antwoordt de aanroep met 400 en het verzoek ze te versoepelen, in plaats van een halve puzzel op te slaan.
Instellingen die het leest
Veld
Type
Wat het doet
sentence
verplicht
string
string
De zin die spelers onthullen door de sommen op te lossen.
difficulty_level
optioneelin settings
number
number
De hoogste uitkomst die een som mag hebben.
Een van20501001000
Standaard: "100"
operators
optioneelin settings
string[]
string[]
Welke bewerkingen mogen voorkomen. x is vermenigvuldigen, : is delen.
Een van+-x:
Standaard: ["+", "-", "x", ":"]
max_operations
optioneelin settings
number
number
Hoeveel bewerkingen één som achter elkaar mag zetten.
Een van123
Standaard: 1
number_difficulty
optioneelin settings
number
number
Begrenst de losse getallen binnen een som. Ergens tussen 5 en 1000.
Niets. De hele puzzel komt voort uit zijn twee instellingen.
Valt terug op de naam “Sudoku API”
Goed om te weten
Stuur geen items en geen sentence — size en difficulty zijn de volledige invoer.
De editor biedt de moeilijkheidsgraad alleen aan voor 2x3, 3x3 en 3x4. De API past hem toe op elke grootte, 2x2 en 4x4 inbegrepen.
Instellingen die het leest
Veld
Type
Wat het doet
size
optioneelin settings
string
string
De grootte van één blok, geschreven als rijen bij kolommen — 3x3 geeft het klassieke 9x9-raster. Het endpoint controleert alleen of het als twee getallen te lezen is, dus houd het bij de groottes die de editor aanbiedt.
Een van2x22x33x33x44x4
Standaard: "3x3"
difficulty_level
optioneelin settings
string
string
Hoeveel getallen er op het bord blijven staan om mee te beginnen.
Eén afbeeldings-URL, in het veld image. Dit endpoint neemt geen items.
Valt terug op de naam “Jigsaw Game API”
Goed om te weten
De API maakt altijd een legpuzzel van 4 bij 4. Aantal stukjes, onregelmatige stukjes en rechte randen zijn instellingen in de editor — rows of columns hier meesturen doet niets.
De URL wordt opgeslagen zoals je hem stuurde en het bestand wordt nooit gekopieerd, dus hij moet openbaar bereikbaar blijven zolang de activiteit gespeeld wordt.
Instellingen die het leest
Veld
Type
Wat het doet
image
verplicht
string
string
Absolute URL van de afbeelding die in stukken wordt geknipt. Wordt op het hoogste niveau gestuurd, niet binnen settings.
Eén afbeeldings-URL, binnen settings. Dit endpoint neemt geen items.
Valt terug op de naam “Sliding Puzzle API”
Goed om te weten
Anders dan de legpuzzel leest dit endpoint zijn afbeelding uit settings.image. Een image-veld op het hoogste niveau wordt genegeerd en de aanroep antwoordt met 400.
De URL wordt opgeslagen zoals je hem stuurde en het bestand wordt nooit gekopieerd, dus hij moet openbaar bereikbaar blijven zolang de activiteit gespeeld wordt.
Instellingen die het leest
Veld
Type
Wat het doet
image
verplichtin settings
string
string
Absolute URL van de afbeelding die door elkaar wordt geschoven. Anders dan bij de legpuzzel staat deze binnen settings.