Pular para o conteúdo
Para desenvolvedores

API de desenvolvedores v1.0

Crie o jogo, envie o .zip, a capa e os prints, defina o preço e mande para revisão — tudo por HTTP, com uma chave do seu estúdio. É a mesma API que a sua IA pode usar para publicar sozinha.

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. 1 Crie a chave No estúdio, aba Desenvolvedores. Marque só as permissões que a integração precisa.
  2. 2 Teste a conexão GET /api/v1/eu devolve seu time, escopos e limites.
  3. 3 Crie o jogo POST /api/v1/jogos devolve o slug — ele identifica o jogo em todas as outras chamadas.
  4. 4 Mande os arquivos O .zip do jogo, a capa 16:9 e de 2 a 4 prints.
  5. 5 Defina o preço Opcional: produto tipo "jogo" para cobrar, ou moedas, itens e assinatura.
  6. 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.

EscopoO que libera
jogos:lerListar seus jogos, ver status de revisão e baixar métricas.
jogos:escrever escritaCriar rascunhos, editar textos, enviar o .zip, a capa e os prints.
produtos:escrever escritaCriar e alterar preço do jogo, moedas, itens e assinaturas.
publicar escritaMandar 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…"} }
codigoHTTPQuando acontece
chave_ausente401Não veio o cabeçalho Authorization: Bearer …
chave_invalida401Chave com formato errado, revogada ou inexistente.
team_divergente403O X-Team-Id enviado não é o do dono da chave.
estudio_suspenso403Estúdio suspenso: fale com o suporte.
escopo_faltando403A chave não tem o escopo que o endpoint exige.
nao_encontrado404Jogo, print ou produto não existe (ou não é seu).
metodo_invalido405Método HTTP errado para essa rota.
json_invalido422O corpo não é um JSON de objeto válido.
validacao422Um ou mais campos inválidos — veja o objeto "campos".
limite429Passou do limite de chamadas por hora (cabeçalho Retry-After).
erro_interno500Falha 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)
revisaofiltra 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 jogo

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.

Resposta

{"ok": true}

Publicação e métricas

POST /api/v1/jogos/{slug}/enviar publicar

Enviar para revisão

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)
periododias: 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.

tipoO que éCampos próprios
jogoJogo completo — Compra única que libera o jogo —
moedasPacote de moedas — Moedas creditadas na carteira do jogo moedas
itemItem permanente — Compra única (skin, fase, personagem…) —
consumivelItem consumível — Pode comprar várias vezes; o jogo consome —
assinaturaAssinatura — Cobrança recorrente (VIP, passe…) 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.

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.

Criar a chave

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.