Começando
Tudo o que a API faz, o estúdio também faz pela tela — e vice-versa. Para publicar você precisa de três coisas: uma conta no Let2Play, um estúdio criado em /criador e uma chave de API criada em Estúdio → Desenvolvedores.
-
1
Crie a chave
No estúdio, aba Desenvolvedores. Marque só as permissões que a integração precisa.
-
2
Teste a conexão
GET /api/v1/eu devolve seu time, escopos e limites.
-
3
Crie o jogo
POST /api/v1/jogos devolve o slug — ele identifica o jogo em todas as outras chamadas.
-
4
Mande os arquivos
O .zip do jogo, a capa 16:9 e de 2 a 4 prints.
-
5
Defina o preço
Opcional: produto tipo "jogo" para cobrar, ou moedas, itens e assinatura.
-
6
Envie para revisão
POST …/enviar. Uma pessoa revisa e o jogo entra no portal.
Base de todas as rotas: https://let2play.com. Só HTTPS; corpo e resposta em JSON UTF-8.
Autenticação
Cada estúdio tem um Team ID público (TM-9F2C71A4B8) e uma ou mais chaves. A chave tem o formato l2p_live_<prefixo>_<segredo> e aparece uma única vez, na criação: guardamos só um resumo criptográfico dela. Perdeu, revogue e crie outra.
POST https://let2play.com/api/v1/jogos
Authorization: Bearer l2p_live_a1b2c3d4e5f6_<segredo>
X-Team-Id: TM-9F2C71A4B8 # opcional; se vier, tem de ser o time da chave
Content-Type: application/json
A chave publica jogos em nome do estúdio: trate como senha. Não coloque dentro do jogo, em repositório público, em página web nem em log. Use variável de ambiente (ex.: LET2PLAY_API_KEY). Revogar é imediato — a chamada seguinte recebe 401.
Escopos
Cada chave carrega as permissões que você marcou. Endpoint sem escopo na chave responde 403 com o código escopo_faltando.
| Escopo | O que libera |
jogos:ler | Listar seus jogos, ver status de revisão e baixar métricas. |
jogos:escrever escrita | Criar rascunhos, editar textos, enviar o .zip, a capa e os prints. |
produtos:escrever escrita | Criar e alterar preço do jogo, moedas, itens e assinaturas. |
publicar escrita | Mandar o jogo para a revisão humana do portal. |
Limites
- 600 chamadas por hora por chave; 60 uploads por hora.
- Estourou: HTTP 429 com o cabeçalho Retry-After em segundos. Espere o tempo indicado em vez de repetir.
- Pacote .zip até 100 MB (300 MB descompactado); imagens até 8 MB; 8 prints por jogo.
- Até 10 chaves ativas por estúdio.
Erros
Formato fixo em qualquer falha. Em erro de validação vem também "campos", com o motivo campo por campo — corrija o que ele aponta em vez de repetir a chamada.
{
"erro": "Confira os campos.",
"codigo": "validacao",
"status": 422,
"campos": {"descricao": "A descrição curta precisa de 20 a 300 caracteres…"}
}
| codigo | HTTP | Quando acontece |
chave_ausente | 401 | Não veio o cabeçalho Authorization: Bearer … |
chave_invalida | 401 | Chave com formato errado, revogada ou inexistente. |
team_divergente | 403 | O X-Team-Id enviado não é o do dono da chave. |
estudio_suspenso | 403 | Estúdio suspenso: fale com o suporte. |
escopo_faltando | 403 | A chave não tem o escopo que o endpoint exige. |
nao_encontrado | 404 | Jogo, print ou produto não existe (ou não é seu). |
metodo_invalido | 405 | Método HTTP errado para essa rota. |
json_invalido | 422 | O corpo não é um JSON de objeto válido. |
validacao | 422 | Um ou mais campos inválidos — veja o objeto "campos". |
limite | 429 | Passou do limite de chamadas por hora (cabeçalho Retry-After). |
erro_interno | 500 | Falha nossa. Tente de novo; se insistir, fale com o suporte. |
Ciclo de vida do jogo
O campo revisao conta onde o jogo está: rascunho → em_revisao → aprovado ou reprovado. Enquanto não for aprovado, nada aparece no portal. Reprovado traz o porquê em revisao_motivo.
Depois de aprovado: mudar texto, capa ou prints entra no ar na hora; enviar um .zip novo devolve o jogo para revisão automaticamente (a versão que está no ar continua jogável até a aprovação).
Antes de chamar …/enviar, confira que pendencias está vazio em GET /api/v1/jogos/{slug} — ela lista o que falta (pacote, capa, categorias).
Conta
GET
/api/v1/eu
Quem sou eu
Confere a chave e devolve o time, os escopos e os limites. Use isto como teste de conexão.
Resposta
{
"team_id": "TM-9F2C71A4B8",
"estudio": {"nome": "Estúdio Neon", "slug": "estudio-neon", "url": "https://let2play.com/criador/estudio-neon"},
"chave": {"nome": "Claude Code", "prefixo": "a1b2c3d4e5f6", "escopos": ["jogos:ler","jogos:escrever"]},
"limites": {"chamadas_por_hora": 600, "uploads_por_hora": 60},
"taxa_vendas_pct": 20,
"modo_demo": true,
"api": "1.0"
}
GET
/api/v1/categorias
Categorias disponíveis
Lista os slugs válidos para o campo categorias do jogo. Todo jogo precisa de pelo menos uma.
Resposta
{"categorias": [{"slug": "acao", "nome": "Ação"}, {"slug": "puzzle", "nome": "Puzzle"}]}
Jogos
GET
/api/v1/jogos
jogos:ler
Listar meus jogos
Todos os jogos do time, do mais recente para o mais antigo.
| Parâmetro (query) | |
revisao | filtra por rascunho | em_revisao | aprovado | reprovado |
Resposta
{"jogos": [ … objeto de jogo … ], "total": 3}
POST
/api/v1/jogos
jogos:escrever
Criar jogo (rascunho)
Cria o jogo como rascunho e devolve o slug gerado a partir do título. Nada fica visível no portal até você enviar para revisão e a revisão aprovar. Obrigatórios: titulo (2–60), descricao (20–300) e categorias (1+).
Corpo
{
"titulo": "Coletor de Cristais",
"subtitulo": "Corra, pule, colete",
"descricao": "Pule entre plataformas e colete cristais antes do tempo acabar.",
"descricao_longa": "Texto longo da página do jogo (até 6000 caracteres).",
"como_jogar": "Use as setas para andar e espaço para pular.",
"controles": [["←/→", "Mover"], ["Espaço", "Pular"]],
"tags": ["plataforma", "arcade"],
"categorias": ["acao", "arcade"],
"youtube": "https://youtu.be/XXXXXXXXXXX",
"dois_jogadores": false,
"mobile": true,
"orientacao": "paisagem",
"i18n": {"en": {"titulo": "Crystal Collector", "descricao": "Jump and collect…"}}
}
Resposta
{
"slug": "coletor-de-cristais",
"titulo": "Coletor de Cristais",
"descricao": "Pule entre plataformas e colete cristais antes do tempo acabar.",
"categorias": ["acao", "arcade"],
"revisao": "rascunho",
"status": "oculto",
"no_ar": false,
"preco_centavos": 0,
"tem_pacote": false,
"capa": null,
"prints": [],
"pendencias": ["pacote", "capa"],
"url": "https://let2play.com/jogo/coletor-de-cristais"
}
GET
/api/v1/jogos/{slug}
jogos:ler
Ver um jogo
Estado completo: textos, mídias, preço, situação da revisão e o que falta (pendencias).
Resposta
{
"slug": "coletor-de-cristais",
"titulo": "Coletor de Cristais",
"descricao": "Pule entre plataformas e colete cristais antes do tempo acabar.",
"categorias": ["acao", "arcade"],
"revisao": "rascunho",
"status": "oculto",
"no_ar": false,
"preco_centavos": 0,
"tem_pacote": false,
"capa": null,
"prints": [],
"pendencias": ["pacote", "capa"],
"url": "https://let2play.com/jogo/coletor-de-cristais"
}
PATCH
/api/v1/jogos/{slug}
jogos:escrever
Editar juego
Só os campos enviados mudam. O slug nunca muda (é a URL pública). Se o jogo já está aprovado, textos e imagens entram no ar na hora. Aceita também POST na mesma rota, para clientes que não fazem PATCH.
Corpo
{"descricao": "Nova descrição curta, com mais de vinte caracteres.", "tags": ["arcade","retro"]}
Resposta
{
"slug": "coletor-de-cristais",
"titulo": "Coletor de Cristais",
"descricao": "Pule entre plataformas e colete cristais antes do tempo acabar.",
"categorias": ["acao", "arcade"],
"revisao": "rascunho",
"status": "oculto",
"no_ar": false,
"preco_centavos": 0,
"tem_pacote": false,
"capa": null,
"prints": [],
"pendencias": ["pacote", "capa"],
"url": "https://let2play.com/jogo/coletor-de-cristais"
}
POST
/api/v1/jogos/{slug}/pacote
jogos:escrever
Enviar o .zip do jogo
O jogo em si. Mande o corpo cru do arquivo com Content-Type: application/zip (ou multipart/form-data no campo pacote). O .zip precisa ter index.html na raiz (ou dentro de uma única pasta), máximo 100 MB compactado / 300 MB descompactado. Versão nova em jogo já aprovado volta para revisão automaticamente.
Corpo
<corpo binário do arquivo .zip>
Resposta
{"ok": true, "jogo": { … }, "tem_pacote": true, "revisao": "rascunho"}
POST
/api/v1/jogos/{slug}/capa
jogos:escrever
Enviar a capa
Capa do card (obrigatória para publicar). JPG, PNG ou WebP, até 8 MB; convertemos para WebP e geramos as variantes. Proporção recomendada 16:9 (ex.: 1280×720). Três jeitos de mandar: corpo cru da imagem, multipart/form-data no campo capa, ou JSON com a imagem em base64 — este último é o caminho mais fácil para uma IA que acabou de gerar a arte.
Corpo
{"imagem_base64": "iVBORw0KGgoAAAANSUhEUg…"}
Resposta
{"ok": true, "capa": "https://let2play.com/capas/coletor-de-cristais-a1b2c3.webp"}
GET
/api/v1/jogos/{slug}/prints
jogos:ler
Listar prints
As imagens da galeria da página do jogo.
Resposta
{"prints": [{"id": 12, "url": "https://let2play.com/capas/coletor-de-cristais-tela-aa11bb.webp"}]}
POST
/api/v1/jogos/{slug}/prints
jogos:escrever
Adicionar print
Uma imagem por chamada, até 8 por jogo. Mesmos formatos e mesmos três jeitos de envio da capa (corpo cru, multipart no campo imagem, ou imagem_base64).
Corpo
{"imagem_base64": "iVBORw0KGgoAAAANSUhEUg…"}
Resposta
{"ok": true, "print": {"id": 13, "url": "https://let2play.com/capas/…webp"}, "total": 2}
DELETE
/api/v1/jogos/{slug}/prints/{id}
jogos:escrever
Apagar print
Remove a imagem da galeria e do disco.
Resposta
{"ok": true, "total": 1}
Preços e produtos
GET
/api/v1/jogos/{slug}/produtos
jogos:ler
Listar produtos
Preço do jogo e itens da loja interna, com o total vendido de cada um.
Resposta
{"produtos": [{"codigo": "jogo", "tipo": "jogo", "nome": "Coletor de Cristais", "preco_centavos": 990, "ativo": true, "vendas": 0}]}
POST
/api/v1/jogos/{slug}/produtos
produtos:escrever
Criar ou atualizar produto (definir preço)
Upsert pelo codigo: se já existe, atualiza. Para dar preço ao jogo, use "tipo": "jogo" (um por jogo) — sem esse produto o jogo é grátis. Preço em centavos, de 100 a 100000 (R$ 1,00 a R$ 1.000,00). Tipos: jogo, moedas, item, consumivel, assinatura. moedas exige quantas moedas o pacote dá; assinatura exige intervalo (month|year). Use "ativo": false para tirar de venda. Produto já vendido não pode mudar de codigo nem de tipo.
Corpo
{
"codigo": "moedas-500",
"tipo": "moedas",
"nome": "500 moedas",
"descricao": "Pacote inicial",
"preco_centavos": 990,
"moedas": 500,
"icone": "paid",
"ativo": true,
"i18n": {"en": {"nome": "500 coins"}}
}
Resposta
{"ok": true, "produto": {"codigo": "moedas-500", "preco_centavos": 990, …}, "criado": true}
DELETE
/api/v1/jogos/{slug}/produtos/{codigo}
produtos:escrever
Apagar produto
Só dá para apagar produto que nunca foi vendido. Vendido, use "ativo": false.
Publicação e métricas
POST
/api/v1/jogos/{slug}/enviar
publicar
Enviar a revisión
Equivale ao botão "Enviar para revisão" do estúdio. Exige pacote, capa e categoria (se faltar algo, vem 422 com a lista em pendencias). Depois o jogo fica em_revisao até uma pessoa do portal aprovar ou reprovar — consulte GET /api/v1/jogos/{slug} para ver o resultado e o revisao_motivo.
Resposta
{"ok": true, "revisao": "em_revisao", "enviado_em": "2026-11-08 14:02:11"}
GET
/api/v1/jogos/{slug}/metricas
jogos:ler
Métricas do jogo
Série diária e totais do período: impressões, cliques, páginas vistas, jogadas, tempo, anúncios e receita (em centavos, já descontada a taxa).
| Parâmetro (query) | |
periodo | dias: 7, 30 (padrão) ou 90 |
Resposta
{
"periodo": {"dias": 30, "de": "2026-10-10", "ate": "2026-11-08"},
"totais": {"jogadas": 1240, "views": 3100, "segundos": 86400, "anuncios": 900,
"receita_vendas": 15400, "receita_anuncios": 3600, "receita": 19000},
"dias": [{"dia": "2026-10-10", "jogadas": 12, "views": 40, "receita": 120}]
}
GET
/api/v1/openapi.json
OpenAPI
Especificação OpenAPI 3.1 desta API, gerada do mesmo catálogo que gera esta página. Útil para gerar cliente ou alimentar uma IA.
Resposta
{"openapi": "3.1.0", "info": {"title": "Let2Play Developer API", "version": "1.0"}, …}
Tipos de produto e preço
Preço em centavos de real (BRL), de 100 a 100000. Sem nenhum produto de tipo jogo, o jogo é grátis — e grátis é o que mais ganha com anúncios no começo.
| tipo | O que é | Campos próprios |
jogo | Juego completo — Compra única que desbloquea el juego |
— |
moedas | Paquete de monedas — Monedas acreditadas en la billetera del juego |
moedas |
item | Ítem permanente — Compra única (skin, nivel, personaje…) |
— |
consumivel | Ítem consumible — Se puede comprar varias veces; el juego lo consume |
— |
assinatura | Suscripción — Cobro recurrente (VIP, pase…) |
intervalo (month|year) |
A plataforma fica com 20% de cada venda; o resto cai na sua conta Stripe Connect. Antes de vender, cadastre o recebedor em Estúdio → Recebedor. A receita de anúncios é dividida em 50% para o criador e aparece em Estúdio → Receita.
O código do produto é o que o jogo chama no SDK: Let2Play.comprar("moedas-500"). Produto já vendido não muda de código nem de tipo, e não pode ser apagado — use "ativo": false.
Dentro do jogo (SDK)
O jogo roda num iframe isolado, sem acesso a cookies nem ao localStorage do portal. Conta, moedas compradas, itens, ranking, save na nuvem e checkout passam pelo SDK — o servidor confere tudo.
<script src="https://let2play.com/sdk/let2play.js"></script>
const eu = await Let2Play.iniciar(); // {logado, apelido, moedas, itens, assinaturas, jogo_comprado}
Let2Play.inicioPartida(); Let2Play.fimPartida(pontos); // ranking
await Let2Play.salvar({fase: 7}); const save = await Let2Play.carregar();
const r = await Let2Play.comprar('moedas-500'); // abre o checkout no portal
const g = await Let2Play.gastar(100, 'continuar'); // moedas compradas: o servidor recusa sem saldo
Referência completa do SDK em Estúdio → SDK do jogo e as regras do pacote em CONTRATO.md.
smart_toy Conecte a sua IA
Cole o roteiro abaixo no Claude Code, Cursor, Codex, ChatGPT ou no seu próprio agente: ele traz os endereços, a ordem das chamadas e as regras. A chave entra por variável de ambiente — não cole a chave no chat.
A IA pode ler esta documentação inteira em https://let2play.com/desenvolvedores/api.md (markdown) e as rotas em https://let2play.com/api/v1/openapi.json.
Publicou pela IA? A responsabilidade continua sua: conteúdo, direitos de imagens e sons, e o que o pacote faz no navegador do jogador.
Checklist da revisão
O que olhamos antes de aprovar — conferir isso antes de enviar economiza uma rodada:
- O jogo abre e é jogável no celular e no computador (se marcou mobile, precisa funcionar no toque).
- index.html na raiz do .zip, sem depender de arquivo externo que você não controla.
- Capa é arte (keyart) 16:9, legível no card pequeno — não é print de gameplay nem imagem de outro jogo.
- Título, descrição e prints são do seu jogo e não imitam marca de terceiros.
- Imagens, sons e fontes com licença que permita uso comercial.
- Sem conteúdo adulto, violência explícita, apostas com dinheiro real, chat aberto nem coleta de dados pessoais dentro do jogo.
- Moedas e itens comprados nunca ficam só no navegador: use o SDK, senão quem pagou perde tudo ao limpar os dados.
Regras completas nos Termos do Criador. Dúvida que a documentação não responde? Fale com a gente.