Un POST par type d'activité. Envoie ton contenu en JSON et récupère une activité dans ton compte Puzzel.org, avec une URL à donner aux joueurs ou à glisser dans une iframe.
URL de base
https://puzzel.org/api/public/v1
Auth
Clé + e-mail dans le corps
Points de terminaison
20 types d'activités
Quota
10 activités par jour
Ta première requête
Rien à installer et aucune poignée de main : envoie un corps JSON avec ta clé, ton e-mail et ton contenu. La réponse contient la clé de la nouvelle activité et l'URL où elle se joue.
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": "fr",
"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"
}
]
}'
Chaque exemple de cette page est une requête complète et exécutable. Remplace la clé et le contenu par les tiens et ça fonctionne tel quel.
Authentification
Il n'y a ni en-têtes ni jeton bearer. Les deux identifiants voyagent dans le corps JSON de chaque requête, et la clé n'est acceptée que pour le compte auquel cet e-mail appartient.
Champ
Type
Rôle
account_api_key
obligatoire
string
string
La clé API de ton compte. Elle va dans le corps, pas dans un en-tête.
email
obligatoire
string
string
L'adresse avec laquelle ton compte Puzzel.org se connecte. La clé n'est valide qu'avec elle.
Ta clé se trouve dans la section compte de ton tableau de bord, derrière Afficher.
Traite la clé comme un mot de passe. Elle crée et écrase des activités dans ton compte : garde-la côté serveur, hors de portée de tout ce qu'un navigateur peut lire.
Le corps de la requête
Chaque point de terminaison prend les cinq mêmes champs. Ce qui change, c'est le champ de contenu en dessous : la plupart prennent un tableau d'items, quelques-uns une seule phrase ou une seule image, et le sudoku ne prend rien du tout.
Champ
Type
Rôle
account_api_key
obligatoire
string
string
La clé API de ton compte. Elle va dans le corps, pas dans un en-tête.
email
obligatoire
string
string
L'adresse avec laquelle ton compte Puzzel.org se connecte. La clé n'est valide qu'avec elle.
title
facultatif
string
string
Le nom que l'activité reçoit dans ton tableau de bord. Omets-le et le point de terminaison utilise son propre nom de repli.
language
facultatif
string
string
Détermine seulement la langue dans l'URL renvoyée — rien de ce que tu envoies n'est traduit. Les mots mêlés le lisent aussi pour passer leurs lettres de remplissage à l'arabe quand il vaut "ar".
Par défaut: "en"
activity_key
facultatif
string
string
Omets-le pour créer une nouvelle activité. Passe la clé d'une activité que tu possèdes déjà et c'est celle-ci qui est reconstruite.
settings est un objet d'options propres à chaque point de terminaison. Celles qu'un point de terminaison lit sont listées avec lui ci-dessous ; tout le reste y est ignoré.
Ce qui est renvoyé
Un appel réussi répond 200 avec la clé de la nouvelle activité et l'URL où elle se joue. Tout le reste répond avec success à false et une seule chaîne error.
{
"success": false,
"error": "Invalid Email or API Key"
}
L'url renvoyée est la vue intégrée. Remplace embed par play pour l'ouvrir en pleine page, ou par build pour l'ouvrir dans l'éditeur — la clé après p= ne change pas.
Créer ou mettre à jour
Envoie activity_key et l'activité correspondante est reconstruite sur place : son contenu est remplacé, son nom et son horodatage de version sont rafraîchis, et la clé elle-même ne change pas — les liens et les intégrations déjà partagés continuent donc de fonctionner. Les résultats, le classement dans les dossiers et tous les paramètres que le point de terminaison n'écrit pas lui-même restent tels quels.
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 est appliqué à chaque mise à jour, sa valeur par défaut comprise — omets-le et l'activité est renommée avec le nom de repli de ce point de terminaison.
Les blocs de paramètres qu'un point de terminaison écrit lui-même sont réécrits de zéro : une mise à jour les ramène donc aux valeurs que tu envoies, ou à celles par défaut du point de terminaison.
Tu ne peux mettre à jour que les activités appartenant à ton propre compte. La clé de quelqu'un d'autre répond 403.
Une mise à jour coûte autant qu'une création : un appel sur le quota du jour.
Limite de débit
10
10 activités par compte et par jour
Chaque appel réussi compte, créations comme mises à jour. Dépasse la limite et la requête suivante répond 429 jusqu'à la remise à zéro du compteur.
Le compteur est remis à zéro une fois par jour par une tâche planifiée, et non sur une fenêtre glissante de 24 heures.
Erreurs
Les erreurs arrivent toujours en JSON avec les deux mêmes champs, jamais sous forme de page HTML. La chaîne error est écrite pour être lue par un humain : elle nomme le champ ou la limite qui a échoué.
Statut
Signification
400
Bad Request
Quelque chose dans le corps manque, est mal formé ou hors limites. Le message nomme le champ.
401
Unauthorized
L'e-mail est inconnu, ou la clé n'appartient pas à ce compte.
403
Forbidden
Le activity_key que tu as envoyé appartient à un autre compte.
429
Too Many Requests
Le quota du jour est épuisé. Il se réinitialise une fois par jour.
500
Server Error
Le générateur n'a pas pu construire de casse-tête avec ce que tu as envoyé — en général trop peu de mots, ou des mots impossibles à assembler.
Points de terminaison
Un chemin par type d'activité, tous en POST, tous sous la même URL de base. Chacun indique le contenu dont il a besoin, les paramètres qu'il lit et une requête que tu peux exécuter.
Mots et lettres
F
I
G
A
T
R
I
P
M
Mots croisés
Imbrique tes réponses dans une grille et numérote les définitions pour toi.
Un tableau de mots. Chaque entrée associe la réponse à la définition qui la désigne.
Nom de repli : “Crossword API”
Bon à savoir
Les réponses de moins de deux caractères sont écartées avant la construction de la grille, et il faut qu'il en reste au moins deux.
Les réponses sont mises en majuscules et le générateur dispose de vingt tentatives pour les placer. S'il n'arrive à placer aucun mot, l'appel répond 500.
Exemple de requête
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": "fr",
"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"
}
]
}'
POST/api/public/v1/wordseekerAu moins 2 dans items
Contenu
Un tableau de mots. Le texte de la définition devient la liste de mots à partir de laquelle les joueurs travaillent.
Nom de repli : “Wordseeker API”
Bon à savoir
Les réponses de moins de deux caractères sont écartées, et chaque réponse est mise en majuscules avant d'entrer dans la grille.
La grille est complétée avec des lettres latines, sauf si language vaut "ar", ce qui bascule le remplissage en arabe.
Paramètres lus
Champ
Type
Rôle
hidden_solution
facultatifdans settings
string
string
Les lettres restantes forment ce texte. Le définir indique aussi au générateur de placer la solution en premier plutôt que de caser un maximum de mots.
directions
facultatifdans settings
string[]
string[]
Les sens dans lesquels un mot peut se lire. Omets-le et les mots vont uniquement vers l'est, le sud-est et le sud.
Au choixwesteastnorthsouthnorthwestnortheastsouthwestsoutheast
Par défaut: ["east", "southeast", "south"]
template
facultatifdans settings
string
string
Découpe la grille en une forme au lieu de la laisser carrée.
Au choixsquarecirclecrossdiamondpyramidsmileystarcross_plus
Exemple de requête
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": "fr",
"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"
}
}'
Un tableau de mots. À eux tous, ils doivent fournir chaque lettre du mot caché.
Nom de repli : “Acrostic API”
Bon à savoir
Si les réponses ne peuvent pas fournir les lettres dont la solution a besoin, l'appel répond 500 plutôt que d'enregistrer une grille à moitié construite.
Le générateur réordonne tes réponses pour que la colonne fonctionne : l'ordre que tu envoies n'est donc pas celui que voient les joueurs.
Paramètres lus
Champ
Type
Rôle
hidden_solution
obligatoiredans settings
string
string
Le mot que forme la colonne mise en évidence. Ce point de terminaison ne fonctionne pas sans lui.
Exemple de requête
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": "fr",
"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-scrambleAu moins 1 dans items
Contenu
api_c_word_scramble
Nom de repli : “Word Scramble API”
Bon à savoir
Les activités créées via l'API ont toujours le paramètre de mélange de l'ordre activé : l'ordre que tu envoies n'est donc pas celui que reçoivent les joueurs.
Paramètres lus
Champ
Type
Rôle
hidden_solution
facultatifdans settings
string
string
Un mot bonus facultatif que les joueurs saisissent une fois le reste résolu.
Exemple de requête
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": "fr",
"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-practiceAu moins 1 dans items
Contenu
api_c_typing_practice
Nom de repli : “Typing Practice API”
Exemple de requête
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": "fr",
"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"
}
]
}'
Succès
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/typing-practice/embed?p=-Nq8sample_activity_key",
"message": "Typing Practice created successfully"
}
Un tableau de paires. Chaque paire contient les deux cartes qui vont ensemble.
Nom de repli : “Memory Game API”
Bon à savoir
Une carte est un objet avec un champ type et un champ value. Utilise "text" pour des mots, ou "image", "audio", "youtube" ou "link" avec une URL dans value, et ajoute alt pour une description.
POST/api/public/v1/matching-pairsAu moins 2 dans items
Contenu
api_c_matching_pairs
Nom de repli : “Matching Game API”
Bon à savoir
Une carte est un objet avec un champ type et un champ value. Utilise "text" pour des mots, ou "image", "audio", "youtube" ou "link" avec une URL dans value, et ajoute alt pour une description.
POST/api/public/v1/flash-cardsAu moins 1 dans items
Contenu
api_c_flash_cards
Nom de repli : “Flash Cards API”
Bon à savoir
Le point de terminaison enregistre autant de cartes que tu en envoies : envoie-en donc exactement deux par entrée — le recto, puis le verso.
Une carte est un objet avec un champ type et un champ value. Utilise "text" pour des mots, ou "image", "audio", "youtube" ou "link" avec une URL dans value, et ajoute alt pour une description.
POST/api/public/v1/categorizeAu moins 2 dans items
Contenu
Un tableau de catégories, chacune avec un nom et les cartes qui lui appartiennent.
Nom de repli : “Categorize Game API”
Bon à savoir
Une catégorie envoyée sans nom est enregistrée sous “Untitled Category” : envoie-en donc toujours un.
Une carte est un objet avec un champ type et un champ value. Utilise "text" pour des mots, ou "image", "audio", "youtube" ou "link" avec une URL dans value, et ajoute alt pour une description.
Un tableau de séquences. Chacune contient ses cartes dans le bon ordre.
Nom de repli : “Reorder Game API”
Bon à savoir
L'ordre que tu envoies est enregistré comme l'ordre correct — le numéro un en premier.
Une carte est un objet avec un champ type et un champ value. Utilise "text" pour des mots, ou "image", "audio", "youtube" ou "link" avec une URL dans value, et ajoute alt pour une description.
Un tableau de questions. Les questions à choix multiple portent leurs réponses ; les questions ouvertes portent la réponse que tu acceptes.
Nom de repli : “Quiz API”
Bon à savoir
question_type vaut soit "multiple_choice", où la bonne option porte isCorrect à true, soit "open_answer", qui utilise correct_answer à la place. Omis, il est traité comme un choix multiple.
Le point de terminaison quiz transmet settings tel quel sous forme de blocs de paramètres d'activité : ce n'est donc pas l'endroit pour des options en vrac — ajuste le quiz dans l'éditeur ensuite.
Exemple de requête
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": "fr",
"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."
}
]
}'
POST/api/public/v1/board-gameAu moins 1 dans items
Contenu
api_c_board_game
Nom de repli : “Board Game API”
Bon à savoir
question_type vaut soit "multiple_choice", où la bonne option porte isCorrect à true, soit "open_answer", qui utilise correct_answer à la place. Omis, il est traité comme un choix multiple.
Paramètres lus
Champ
Type
Rôle
number_of_tiles
facultatifdans settings
number
number
Le nombre de cases du plateau. Entre 10 et 75.
Par défaut: 30
game_mode
facultatifdans settings
string
string
Si les joueurs foncent vers l'arrivée ou collectent des objets en chemin.
Au choixrace_to_finishcollect_items
Par défaut: "race_to_finish"
Exemple de requête
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": "fr",
"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"
}
}'
Succès
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/board-game/embed?p=-Nq8sample_activity_key",
"message": "Board Game created successfully"
}
POST/api/public/v1/calculationNe prend pas d'items
Contenu
Une phrase, dans le champ sentence. Ce point de terminaison ne prend pas d'items.
Nom de repli : “Calculation Game API”
Bon à savoir
Si les contraintes sont trop strictes pour encoder la phrase, l'appel répond 400 en te demandant de les assouplir plutôt que d'enregistrer un casse-tête partiel.
Paramètres lus
Champ
Type
Rôle
sentence
obligatoire
string
string
La phrase que les joueurs découvrent en résolvant les calculs.
difficulty_level
facultatifdans settings
number
number
Le résultat le plus élevé qu'un calcul peut avoir.
Au choix20501001000
Par défaut: "100"
operators
facultatifdans settings
string[]
string[]
Les opérations autorisées. x correspond à la multiplication, : à la division.
Au choix+-x:
Par défaut: ["+", "-", "x", ":"]
max_operations
facultatifdans settings
number
number
Le nombre d'opérations qu'un même calcul peut enchaîner.
Au choix123
Par défaut: 1
number_difficulty
facultatifdans settings
number
number
Plafonne les nombres à l'intérieur d'un calcul. De 5 à 1000, au choix.
Rien. Tout le casse-tête découle de ses deux paramètres.
Nom de repli : “Sudoku API”
Bon à savoir
N'envoie ni items ni sentence — la taille et la difficulté sont toute l'entrée.
L'éditeur ne propose la difficulté que pour 2x3, 3x3 et 3x4. L'API l'applique à toutes les tailles, 2x2 et 4x4 compris.
Paramètres lus
Champ
Type
Rôle
size
facultatifdans settings
string
string
La taille d'un bloc, écrite en lignes par colonnes — 3x3 donne la grille classique 9x9. Le point de terminaison vérifie seulement que ça se lit comme deux nombres : reste donc sur les tailles proposées par l'éditeur.
Au choix2x22x33x33x44x4
Par défaut: "3x3"
difficulty_level
facultatifdans settings
string
string
Le nombre de chiffres laissés sur la grille au départ.
Une URL d'image, dans le champ image. Ce point de terminaison ne prend pas d'items.
Nom de repli : “Jigsaw Game API”
Bon à savoir
L'API crée toujours un puzzle de 4 sur 4. Le nombre de pièces, les pièces irrégulières et les bords droits sont des paramètres de l'éditeur — envoyer rows ou columns ici ne fait rien.
L'URL est enregistrée telle que tu l'as envoyée et le fichier n'est jamais copié : elle doit donc rester accessible publiquement aussi longtemps que l'activité est jouée.
Paramètres lus
Champ
Type
Rôle
image
obligatoire
string
string
URL absolue de l'image à découper. Envoyée au premier niveau, pas dans settings.
POST/api/public/v1/slidingpuzzleNe prend pas d'items
Contenu
Une URL d'image, dans settings. Ce point de terminaison ne prend pas d'items.
Nom de repli : “Sliding Puzzle API”
Bon à savoir
Contrairement au puzzle, ce point de terminaison lit son image dans settings.image. Un champ image au premier niveau est ignoré et l'appel répond 400.
L'URL est enregistrée telle que tu l'as envoyée et le fichier n'est jamais copié : elle doit donc rester accessible publiquement aussi longtemps que l'activité est jouée.
Paramètres lus
Champ
Type
Rôle
image
obligatoiredans settings
string
string
URL absolue de l'image à mélanger. Contrairement à celle du puzzle, celle-ci se place dans settings.