Um POST por tipo de atividade. Envia o teu conteúdo em JSON e recebes uma atividade na tua conta Puzzel.org e um URL que podes dar aos jogadores ou colocar num iframe.
URL base
https://puzzel.org/api/public/v1
Autenticação
Chave + e-mail no corpo
Endpoints
20 tipos de atividade
Quota
10 atividades por dia
O teu primeiro pedido
Não há nada para instalar nem qualquer negociação prévia: envia um corpo em JSON com a tua chave, o teu e-mail e o teu conteúdo. A resposta traz a chave da nova atividade e o URL onde se joga.
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": "pt",
"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"
}
]
}'
Todos os exemplos desta página são pedidos completos e prontos a executar. Troca a chave e o conteúdo pelos teus e funcionam tal como estão.
Autenticação
Não há cabeçalhos nem bearer token. As duas credenciais viajam no corpo JSON de cada pedido e a chave só é aceite para a conta a que esse e-mail pertence.
Campo
Tipo
O que faz
account_api_key
obrigatório
string
string
A chave de API da tua conta. Vai no corpo, não num cabeçalho.
email
obrigatório
string
string
O endereço com que a tua conta Puzzel.org inicia sessão. A chave só é válida em conjunto com ele.
A tua chave está na secção da conta, no painel, atrás de Mostrar.
Trata a chave como uma palavra-passe. Cria e substitui atividades na tua conta, por isso guarda-a no servidor e fora de tudo o que um navegador possa ler.
O corpo do pedido
Todos os endpoints recebem os mesmos cinco campos. O que muda é o campo de conteúdo por baixo deles: a maioria recebe um array de itens, alguns recebem uma frase ou uma imagem, e o sudoku não recebe nada.
Campo
Tipo
O que faz
account_api_key
obrigatório
string
string
A chave de API da tua conta. Vai no corpo, não num cabeçalho.
email
obrigatório
string
string
O endereço com que a tua conta Puzzel.org inicia sessão. A chave só é válida em conjunto com ele.
title
opcional
string
string
O nome que a atividade recebe no teu painel. Se o deixares de fora, o endpoint usa o nome alternativo dele.
language
opcional
string
string
Só define o idioma no URL que recebes de volta — não traduz nada do que envias. A sopa de letras também o lê para mudar as letras de preenchimento para árabe quando é "ar".
Predefinição: "en"
activity_key
opcional
string
string
Deixa-o de fora para criar uma atividade nova. Se enviares a chave de uma que já te pertence, essa atividade é reconstruída.
settings é um objeto com opções específicas de cada endpoint. As que cada endpoint lê estão listadas com ele mais abaixo; tudo o resto que lá puseres é ignorado.
O que recebes de volta
Uma chamada bem-sucedida responde 200 com a chave da nova atividade e o URL onde se joga. Tudo o resto responde com success a false e uma única string error.
{
"success": false,
"error": "Invalid Email or API Key"
}
O url que recebes de volta é a vista de incorporação. Troca embed por play para a abrir em página inteira, ou por build para a abrir no editor — a chave depois de p= mantém-se igual.
Criar vs. atualizar
Envia activity_key e a atividade correspondente é reconstruída no lugar: o conteúdo é substituído, o nome e a marca de versão são atualizados e a chave em si mantém-se — por isso as ligações e as incorporações que já partilhaste continuam a funcionar. Os resultados, a pasta onde está e todas as definições que o endpoint não escreve ficam como estavam.
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 é aplicado em todas as atualizações, incluindo a predefinição — se o deixares de fora, a atividade passa a ter o nome alternativo desse endpoint.
Os blocos de definições que um endpoint escreve são reescritos de raiz, por isso uma atualização também os repõe nos valores que enviares, ou nas predefinições do endpoint.
Só podes atualizar atividades da tua própria conta. A chave de outra pessoa responde 403.
Uma atualização custa o mesmo que uma criação: uma chamada retirada à quota de hoje.
Limite de pedidos
10
10 atividades por conta por dia
Todas as chamadas bem-sucedidas contam, tanto criações como atualizações. Se passares do limite, o pedido seguinte responde 429 até o contador ser reposto.
O contador é limpo uma vez por dia por uma tarefa agendada, não numa janela móvel de 24 horas.
Erros
Os erros chegam sempre em JSON com os mesmos dois campos, nunca como uma página HTML. A string error está escrita para ser lida por uma pessoa — indica o campo ou o limite que falhou.
Estado
O que significa
400
Bad Request
Falta algo no corpo, está malformado ou fora do intervalo. A mensagem indica o campo.
401
Unauthorized
O e-mail é desconhecido, ou a chave não pertence a essa conta.
403
Forbidden
O activity_key que enviaste pertence a outra conta.
429
Too Many Requests
A quota de hoje está esgotada. É reposta uma vez por dia.
500
Server Error
O gerador não conseguiu criar um quebra-cabeças com o que enviaste — normalmente por serem poucas palavras, ou palavras que não encaixam umas nas outras.
Endpoints
Um caminho por tipo de atividade, todos POST, todos sob o mesmo URL base. Cada um indica o conteúdo de que precisa, as definições que lê e um pedido que podes executar.
Palavras e letras
F
I
G
A
T
R
I
P
M
Palavras cruzadas
Encaixa as tuas respostas numa grelha e numera as definições por ti.
Um array de palavras. Cada entrada junta a resposta à definição que lhe aponta.
Por omissão, fica com o nome “Crossword API”
Vale a pena saber
As respostas com menos de dois carateres são descartadas antes de a grelha ser criada, e pelo menos duas têm de sobreviver a isso.
As respostas passam a maiúsculas e o gerador tem vinte tentativas para as encaixar. Se não conseguir colocar uma única palavra, a chamada responde 500.
Pedido de exemplo
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": "pt",
"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/wordseekerPelo menos 2 em items
Conteúdo
Um array de palavras. O texto da definição passa a ser a lista de palavras com que os jogadores trabalham.
Por omissão, fica com o nome “Wordseeker API”
Vale a pena saber
As respostas com menos de dois carateres são descartadas, e todas as respostas passam a maiúsculas antes de entrarem na grelha.
A grelha é preenchida com letras latinas, a não ser que language seja "ar", o que muda o preenchimento para árabe.
Definições que lê
Campo
Tipo
O que faz
hidden_solution
opcionalem settings
string
string
As letras que sobram formam isto. Defini-lo também diz ao gerador para encaixar primeiro a solução, em vez de meter o máximo de palavras que conseguir.
directions
opcionalem settings
string[]
string[]
As direções em que uma palavra pode seguir. Se o deixares de fora, as palavras seguem apenas para leste, sudeste e sul.
Um dewesteastnorthsouthnorthwestnortheastsouthwestsoutheast
Predefinição: ["east", "southeast", "south"]
template
opcionalem settings
string
string
Recorta a grelha numa forma, em vez de a deixar quadrada.
Um desquarecirclecrossdiamondpyramidsmileystarcross_plus
Pedido de exemplo
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": "pt",
"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/word-scramblePelo menos 1 em items
Conteúdo
api_c_word_scramble
Por omissão, fica com o nome “Word Scramble API”
Vale a pena saber
As atividades criadas através da API têm sempre a definição de baralhar a ordem ativa, por isso a ordem que envias não é a ordem que os jogadores recebem.
Definições que lê
Campo
Tipo
O que faz
hidden_solution
opcionalem settings
string
string
Uma palavra bónus opcional que os jogadores escrevem depois de resolverem o resto.
Pedido de exemplo
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": "pt",
"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-practicePelo menos 1 em items
Conteúdo
api_c_typing_practice
Por omissão, fica com o nome “Typing Practice API”
Pedido de exemplo
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": "pt",
"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"
}
]
}'
Sucesso
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/typing-practice/embed?p=-Nq8sample_activity_key",
"message": "Typing Practice created successfully"
}
Um array de pares. Cada par contém os dois cartões que pertencem um ao outro.
Por omissão, fica com o nome “Memory Game API”
Vale a pena saber
Um cartão é um objeto com um type e um value. Usa "text" para palavras, ou "image", "audio", "youtube" ou "link" com um URL em value, e acrescenta alt para uma descrição.
POST/api/public/v1/matching-pairsPelo menos 2 em items
Conteúdo
api_c_matching_pairs
Por omissão, fica com o nome “Matching Game API”
Vale a pena saber
Um cartão é um objeto com um type e um value. Usa "text" para palavras, ou "image", "audio", "youtube" ou "link" com um URL em value, e acrescenta alt para uma descrição.
POST/api/public/v1/flash-cardsPelo menos 1 em items
Conteúdo
api_c_flash_cards
Por omissão, fica com o nome “Flash Cards API”
Vale a pena saber
O endpoint guarda tantos cartões quantos enviares, por isso envia exatamente dois por entrada — primeiro a frente, depois o verso.
Um cartão é um objeto com um type e um value. Usa "text" para palavras, ou "image", "audio", "youtube" ou "link" com um URL em value, e acrescenta alt para uma descrição.
POST/api/public/v1/categorizePelo menos 2 em items
Conteúdo
Um array de categorias, cada uma com um nome e os cartões que lhe pertencem.
Por omissão, fica com o nome “Categorize Game API”
Vale a pena saber
Uma categoria enviada sem nome é guardada como “Untitled Category”, por isso envia sempre um.
Um cartão é um objeto com um type e um value. Usa "text" para palavras, ou "image", "audio", "youtube" ou "link" com um URL em value, e acrescenta alt para uma descrição.
Um array de sequências. Cada uma contém os cartões pela ordem correta.
Por omissão, fica com o nome “Reorder Game API”
Vale a pena saber
A ordem que envias é guardada como a ordem correta — o número um primeiro.
Um cartão é um objeto com um type e um value. Usa "text" para palavras, ou "image", "audio", "youtube" ou "link" com um URL em value, e acrescenta alt para uma descrição.
Um array de perguntas. As perguntas de escolha múltipla levam as respetivas respostas; as de resposta aberta levam a resposta que aceitas.
Por omissão, fica com o nome “Quiz API”
Vale a pena saber
question_type é "multiple_choice", em que a opção certa leva isCorrect a true, ou "open_answer", que usa antes correct_answer. Se for deixado de fora, é tratado como escolha múltipla.
O endpoint do quiz passa settings diretamente como blocos de definições da atividade, por isso não é sítio para opções soltas — ajusta o quiz no editor depois.
Pedido de exemplo
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": "pt",
"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-gamePelo menos 1 em items
Conteúdo
api_c_board_game
Por omissão, fica com o nome “Board Game API”
Vale a pena saber
question_type é "multiple_choice", em que a opção certa leva isCorrect a true, ou "open_answer", que usa antes correct_answer. Se for deixado de fora, é tratado como escolha múltipla.
Definições que lê
Campo
Tipo
O que faz
number_of_tiles
opcionalem settings
number
number
Quantas casas tem o tabuleiro. Entre 10 e 75.
Predefinição: 30
game_mode
opcionalem settings
string
string
Se os jogadores correm até à meta ou recolhem itens pelo caminho.
Um derace_to_finishcollect_items
Predefinição: "race_to_finish"
Pedido de exemplo
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": "pt",
"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"
}
}'
Sucesso
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/board-game/embed?p=-Nq8sample_activity_key",
"message": "Board Game created successfully"
}
Uma frase, no campo sentence. Este endpoint não recebe items.
Por omissão, fica com o nome “Calculation Game API”
Vale a pena saber
Se as restrições forem demasiado apertadas para codificar a frase, a chamada responde 400 a pedir que as alargues, em vez de guardar um quebra-cabeças incompleto.
Definições que lê
Campo
Tipo
O que faz
sentence
obrigatório
string
string
A frase que os jogadores descobrem ao resolver as contas.
difficulty_level
opcionalem settings
number
number
O resultado mais alto que uma conta pode ter.
Um de20501001000
Predefinição: "100"
operators
opcionalem settings
string[]
string[]
Que operações podem aparecer. x é multiplicar, : é dividir.
Um de+-x:
Predefinição: ["+", "-", "x", ":"]
max_operations
opcionalem settings
number
number
Quantas operações uma conta pode encadear.
Um de123
Predefinição: 1
number_difficulty
opcionalem settings
number
number
Limita os números individuais dentro de uma conta. De 5 a 1000.
Nada. O quebra-cabeças inteiro sai das duas definições dele.
Por omissão, fica com o nome “Sudoku API”
Vale a pena saber
Não envies items nem sentence — size e difficulty são toda a entrada.
O editor só oferece a dificuldade para 2x3, 3x3 e 3x4. A API aplica-a a todos os tamanhos, incluindo 2x2 e 4x4.
Definições que lê
Campo
Tipo
O que faz
size
opcionalem settings
string
string
O tamanho de um bloco, escrito como linhas por colunas — 3x3 dá a grelha clássica de 9x9. O endpoint só verifica se é interpretável como dois números, por isso fica-te pelos tamanhos que o editor oferece.
Um URL de imagem, no campo image. Este endpoint não recebe items.
Por omissão, fica com o nome “Jigsaw Game API”
Vale a pena saber
A API cria sempre um puzzle de 4 por 4. O número de peças, as peças irregulares e os bordos direitos são definições do editor — enviar rows ou columns aqui não faz nada.
O URL é guardado tal como o enviaste e o ficheiro nunca é copiado, por isso tem de continuar publicamente acessível enquanto a atividade for jogada.
Definições que lê
Campo
Tipo
O que faz
image
obrigatório
string
string
URL absoluto da imagem a cortar. Enviado no nível superior, não dentro de settings.