Jeden POST na typ aktywności. Wyślij swoją treść jako JSON, a w zamian dostaniesz aktywność na koncie Puzzel.org i adres URL, który przekażesz graczom albo wstawisz do iframe.
Bazowy URL
https://puzzel.org/api/public/v1
Uwierzytelnianie
Klucz + e-mail w treści żądania
Endpointy
20 typów aktywności
Limit
10 aktywności dziennie
Twoje pierwsze żądanie
Nic nie instalujesz i nie ma żadnej wstępnej wymiany tokenów: wyślij metodą POST treść JSON ze swoim kluczem, adresem e-mail i zawartością. W odpowiedzi wracają klucz nowej aktywności i adres URL, pod którym się w nią gra.
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": "pl",
"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"
}
]
}'
Każdy przykład na tej stronie to kompletne, gotowe do uruchomienia żądanie. Podstaw własny klucz i własną treść, a zadziała bez żadnych zmian.
Uwierzytelnianie
Nie ma żadnych nagłówków ani tokenu bearer. Oba dane uwierzytelniające jadą w treści JSON każdego żądania, a klucz jest akceptowany tylko dla konta, do którego należy ten adres e-mail.
Pole
Typ
Do czego służy
account_api_key
wymagane
string
string
Klucz API twojego konta. Trafia do treści żądania, a nie do nagłówka.
email
wymagane
string
string
Adres, którym logujesz się na swoje konto Puzzel.org. Klucz jest ważny tylko razem z nim.
Twój klucz znajdziesz w sekcji konta w panelu, pod przyciskiem Pokaż.
Traktuj klucz jak hasło. Tworzy i nadpisuje aktywności na twoim koncie, więc trzymaj go po stronie serwera, z dala od wszystkiego, co może odczytać przeglądarka.
Treść żądania
Każdy endpoint przyjmuje te same pięć pól. Różni się tylko pole z zawartością pod nimi: większość przyjmuje tablicę items, kilka jedno zdanie albo jeden obraz, a sudoku nie przyjmuje niczego.
Pole
Typ
Do czego służy
account_api_key
wymagane
string
string
Klucz API twojego konta. Trafia do treści żądania, a nie do nagłówka.
email
wymagane
string
string
Adres, którym logujesz się na swoje konto Puzzel.org. Klucz jest ważny tylko razem z nim.
title
opcjonalne
string
string
Nazwa, jaką aktywność dostanie w twoim panelu. Pomiń je, a endpoint użyje własnej nazwy zapasowej.
language
opcjonalne
string
string
Decyduje tylko o języku w zwracanym adresie URL — nie tłumaczy niczego, co wysyłasz. Wykreślanka dodatkowo z niego korzysta, by przełączyć litery wypełniające na arabskie, gdy ma wartość "ar".
Domyślnie: "en"
activity_key
opcjonalne
string
string
Pomiń je, aby utworzyć nową aktywność. Podaj klucz aktywności, którą już masz, a zostanie ona przebudowana.
settings to obiekt z opcjami danego endpointu. Które z nich endpoint odczytuje, wypisane jest przy nim niżej; wszystko inne, co tam umieścisz, jest ignorowane.
Co wraca w odpowiedzi
Udane wywołanie odpowiada kodem 200 z kluczem nowej aktywności i adresem URL, pod którym się w nią gra. Wszystko inne odpowiada polem success ustawionym na false i jednym tekstem błędu.
{
"success": false,
"error": "Invalid Email or API Key"
}
Zwracany url to widok osadzony. Zamień embed na play, aby otworzyć go na całej stronie, albo na build, aby otworzyć go w edytorze — klucz po p= pozostaje ten sam.
Tworzenie a aktualizacja
Wyślij activity_key, a stojąca za nim aktywność zostanie przebudowana na miejscu: jej zawartość jest zastępowana, nazwa i znacznik wersji odświeżane, a sam klucz pozostaje ten sam — więc udostępnione już linki i osadzenia działają dalej. Wyniki, umieszczenie w folderze i wszystkie ustawienia, których endpoint sam nie zapisuje, zostają bez zmian.
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 jest stosowane przy każdej aktualizacji, razem z wartością domyślną — pomiń je, a aktywność zostanie przemianowana na nazwę zapasową tego endpointu.
Bloki ustawień, które endpoint zapisuje sam, są pisane od zera, więc aktualizacja resetuje je do wartości, które wyślesz, albo do wartości domyślnych endpointu.
Aktualizować możesz tylko aktywności należące do twojego konta. Cudzy klucz kończy się odpowiedzią 403.
Aktualizacja kosztuje tyle samo co utworzenie: jedno wywołanie z dziennego limitu.
Limit żądań
10
10 aktywności na konto dziennie
Liczy się każde udane wywołanie, zarówno tworzenie, jak i aktualizacja. Po przekroczeniu limitu kolejne żądanie odpowiada kodem 429, dopóki licznik nie zostanie wyzerowany.
Licznik jest zerowany raz dziennie przez zaplanowane zadanie, a nie w ruchomym oknie 24 godzin.
Błędy
Błędy zawsze przychodzą jako JSON z tymi samymi dwoma polami, nigdy jako strona HTML. Tekst błędu jest napisany tak, by przeczytał go człowiek — nazywa pole albo limit, na którym coś się wysypało.
Status
Co oznacza
400
Bad Request
Czegoś w treści żądania brakuje, coś jest źle zbudowane albo poza zakresem. Komunikat wskazuje pole.
401
Unauthorized
Adres e-mail jest nieznany albo klucz nie należy do tego konta.
403
Forbidden
Wysłany activity_key należy do innego konta.
429
Too Many Requests
Dzisiejszy limit został wyczerpany. Zeruje się raz dziennie.
500
Server Error
Generator nie zdołał zbudować łamigłówki z tego, co wysłano — zwykle za mało słów albo słowa, których nie da się ze sobą dopasować.
Endpointy
Jedna ścieżka na typ aktywności, wszystkie POST, wszystkie pod tym samym bazowym URL. Przy każdej wypisana jest treść, której potrzebuje, ustawienia, które odczytuje, i żądanie, które możesz uruchomić.
Słowa i litery
F
I
G
A
T
R
I
P
M
Krzyżówka
Splata twoje odpowiedzi w siatkę i sam numeruje definicje.
POST/api/public/v1/crosswordCo najmniej 2 elementów w items
Treść
Tablica słów. Każdy wpis łączy odpowiedź z definicją, która na nią wskazuje.
W razie braku używa nazwy “Crossword API”
Warto wiedzieć
Odpowiedzi krótsze niż dwa znaki są odrzucane przed zbudowaniem siatki i co najmniej dwie muszą to przetrwać.
Odpowiedzi są zamieniane na wielkie litery, a generator ma dwadzieścia prób, żeby je dopasować. Jeśli nie zdoła umieścić ani jednego słowa, wywołanie odpowiada kodem 500.
Przykładowe żądanie
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": "pl",
"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/wordseekerCo najmniej 2 elementów w items
Treść
Tablica słów. Tekst definicji staje się listą słów, z której korzystają gracze.
W razie braku używa nazwy “Wordseeker API”
Warto wiedzieć
Odpowiedzi krótsze niż dwa znaki są odrzucane, a każda odpowiedź trafia do siatki zamieniona na wielkie litery.
Siatka jest wypełniana literami łacińskimi, chyba że language ma wartość "ar" — wtedy litery wypełniające przełączają się na arabskie.
Odczytywane ustawienia
Pole
Typ
Do czego służy
hidden_solution
opcjonalnew settings
string
string
Pozostałe litery układają się w to rozwiązanie. Ustawienie go mówi też generatorowi, żeby najpierw dopasował rozwiązanie, zamiast upchnąć jak najwięcej słów.
directions
opcjonalnew settings
string[]
string[]
W których kierunkach może biec słowo. Pomiń je, a słowa pobiegną tylko na wschód, na południowy wschód i na południe.
Jedna z wartościwesteastnorthsouthnorthwestnortheastsouthwestsoutheast
Domyślnie: ["east", "southeast", "south"]
template
opcjonalnew settings
string
string
Wycina siatkę w kształt, zamiast zostawiać ją kwadratową.
Jedna z wartościsquarecirclecrossdiamondpyramidsmileystarcross_plus
Przykładowe żądanie
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": "pl",
"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"
}
}'
POST/api/public/v1/wordleCo najmniej 1 elementów w items
Treść
Tablica słów. Gracze dostają jedną rundę na każde słowo.
W razie braku używa nazwy “Wordle API”
Warto wiedzieć
Tworzone z włączonym sprawdzaniem, czy zgadywane słowa naprawdę istnieją. Wyłącz je w edytorze, jeśli twoje słowa to nazwy własne albo wyrazy wymyślone.
POST/api/public/v1/typing-practiceCo najmniej 1 elementów w items
Treść
api_c_typing_practice
W razie braku używa nazwy “Typing Practice API”
Przykładowe żądanie
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": "pl",
"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"
}
]
}'
Sukces
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/typing-practice/embed?p=-Nq8sample_activity_key",
"message": "Typing Practice created successfully"
}
POST/api/public/v1/quizCo najmniej 1 elementów w items
Treść
Tablica pytań. Pytania wielokrotnego wyboru niosą swoje odpowiedzi, pytania otwarte — odpowiedź, którą akceptujesz.
W razie braku używa nazwy “Quiz API”
Warto wiedzieć
question_type to albo "multiple_choice", gdzie poprawna opcja ma isCorrect ustawione na true, albo "open_answer", które zamiast tego korzysta z correct_answer. Pominięte, jest traktowane jako pytanie wielokrotnego wyboru.
Endpoint quizu przekazuje settings prosto jako bloki ustawień aktywności, więc nie jest to miejsce na luźne opcje — quiz dopracuj potem w edytorze.
Przykładowe żądanie
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": "pl",
"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-gameCo najmniej 1 elementów w items
Treść
api_c_board_game
W razie braku używa nazwy “Board Game API”
Warto wiedzieć
question_type to albo "multiple_choice", gdzie poprawna opcja ma isCorrect ustawione na true, albo "open_answer", które zamiast tego korzysta z correct_answer. Pominięte, jest traktowane jako pytanie wielokrotnego wyboru.
Odczytywane ustawienia
Pole
Typ
Do czego służy
number_of_tiles
opcjonalnew settings
number
number
Ile pól ma plansza. Od 10 do 75.
Domyślnie: 30
game_mode
opcjonalnew settings
string
string
Czy gracze ścigają się do mety, czy zbierają po drodze przedmioty.
Jedna z wartościrace_to_finishcollect_items
Domyślnie: "race_to_finish"
Przykładowe żądanie
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": "pl",
"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"
}
}'
Sukces
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/board-game/embed?p=-Nq8sample_activity_key",
"message": "Board Game created successfully"
}
Nie wysyłaj ani items, ani sentence — rozmiar i poziom trudności to całe wejście.
Edytor oferuje poziom trudności tylko dla 2x3, 3x3 i 3x4. API stosuje go do każdego rozmiaru, w tym 2x2 i 4x4.
Odczytywane ustawienia
Pole
Typ
Do czego służy
size
opcjonalnew settings
string
string
Rozmiar jednego bloku, zapisany jako wiersze na kolumny — 3x3 daje klasyczną siatkę 9x9. Endpoint sprawdza tylko, czy da się to odczytać jako dwie liczby, więc trzymaj się rozmiarów, które oferuje edytor.
Jeden adres URL obrazu, w polu image. Ten endpoint nie przyjmuje items.
W razie braku używa nazwy “Jigsaw Game API”
Warto wiedzieć
API zawsze tworzy puzzle 4 na 4. Liczba elementów, nieregularne kształty i proste krawędzie to ustawienia edytora — wysyłanie tutaj rows albo columns nic nie daje.
Adres URL jest zapisywany dokładnie tak, jak go wyślesz, a plik nigdy nie jest kopiowany, więc musi pozostać publicznie dostępny tak długo, jak długo gra się w tę aktywność.
Odczytywane ustawienia
Pole
Typ
Do czego służy
image
wymagane
string
string
Bezwzględny adres URL obrazu do pocięcia. Wysyłany na najwyższym poziomie, nie w settings.
POST/api/public/v1/slidingpuzzleNie przyjmuje items
Treść
Jeden adres URL obrazu, w settings. Ten endpoint nie przyjmuje items.
W razie braku używa nazwy “Sliding Puzzle API”
Warto wiedzieć
W odróżnieniu od puzzli, ten endpoint czyta obraz z settings.image. Pole image na najwyższym poziomie jest ignorowane, a wywołanie odpowiada kodem 400.
Adres URL jest zapisywany dokładnie tak, jak go wyślesz, a plik nigdy nie jest kopiowany, więc musi pozostać publicznie dostępny tak długo, jak długo gra się w tę aktywność.
Odczytywane ustawienia
Pole
Typ
Do czego służy
image
wymaganew settings
string
string
Bezwzględny adres URL obrazu do wymieszania. W odróżnieniu od puzzli, ten trafia do settings.