# plicflix developers — a documentação inteira
Fonte: https://developers.plicflix.com/llms.txt
---
# Comece aqui: do zero ao jogo publicado
Este é o roteiro completo para pôr um jogo no plicflix. Foi escrito para ser
seguido **ao pé da letra**, por uma pessoa ou por uma IA. Cada passo diz o
que fazer, onde, e como saber que deu certo.
> **Para IAs:** a lista de todas as páginas em texto puro está em
> `https://developers.plicflix.com/llms.txt`, e tudo junto em
> `https://developers.plicflix.com/llms-full.txt`. Cada página também existe
> em Markdown: some `.md` ao endereço (ex.: `/docs/COMECE.md`). A API está
> descrita em `https://developers.plicflix.com/openapi.json`.
## O que é o plicflix (em 30 segundos)
- Um app de assinatura de jogos (web, Android, iOS). O jogador paga a
assinatura e joga os jogos parceiros.
- **O plicflix nunca hospeda o seu jogo.** O app abre o **seu** endereço
(iframe na web, WebView no celular) com a tela de carregamento do plicflix
na frente e a bolha do plicflix (avisos, amigos, sair) por cima.
- O jogador **já chega logado**: o app manda um token de uso único; o **seu
servidor** troca o token na API do plicflix e recebe só `id` (`pf_…`) e
`nome` do jogador.
- **Fora do app**, o seu site ou app nativo pode ter o botão **"Entrar com
Plicflix"** (OAuth 2.0 + PKCE): chega o **mesmo** jogador `pf_…`. Isso é
opcional e pode vir depois do passo 11. Veja [OAUTH](OAUTH.md).
- **Você recebe** 60% do líquido de cada assinante, dividido entre os jogos
que ele jogou, pelo tempo ativo (veja [REGRAS](REGRAS)).
## Os endereços
| o quê | endereço |
|---|---|
| este portal (cadastro, painel, documentação) | `https://developers.plicflix.com` |
| o app (onde jogadores e testadores jogam) | `https://plicflix.com` |
| a API (o seu servidor chama) | `https://api.plicflix.com` |
| o SDK do navegador (CDN) | `https://sdk.plicflix.com/plicflix.js` |
| a origem que vai no seu `frame-ancestors` | `https://plicflix.com` |
| suporte | `suporte@plicflix.com` |
Não existe um "ambiente de testes" separado: você testa no plicflix de verdade,
como **testador** do seu próprio jogo ainda não publicado (passo 8). Só você e
quem você indicar enxergam o jogo até a equipe publicar.
## Requisitos do jogo
1. **Ter uma versão web** (HTML5: JavaScript, WebAssembly, Unity WebGL, Godot
Web, Flutter web…) num endereço seu. Jogos só nativos (sem versão web) ainda
não entram.
2. **De preferência, ter um servidor** (qualquer linguagem). É ele quem troca
o token com a chave secreta e guarda o progresso. Sem servidor dá para
integrar ([MOTORES](MOTORES#jogo-sem-servidor)), com limitações.
3. **Poder mudar os cabeçalhos HTTP** da página do jogo (`Content-Security-Policy`
e cookies). Hospedagens estáticas como Netlify, Vercel e Cloudflare Pages
deixam, por arquivo de configuração.
## O roteiro
### 1. Criar a conta de desenvolvedor
- **Onde:** `https://developers.plicflix.com/cadastro`.
- **O quê:** o seu nome, o e-mail, uma senha (10 ou mais caracteres) e o
estúdio (nome, CPF ou CNPJ — com ou sem pontuação —, país, site). Aceite os
[termos](TERMOS).
- **Deu certo quando:** você cai no painel e chega um e-mail de boas-vindas
com o link de confirmar o endereço e a fatura da taxa de entrada.
### 2. Pagar a taxa de entrada
- **Onde:** no painel, a fatura aparece logo no topo (`/faturas/{id}`).
- **Como:** enquanto o pagamento on-line não está ligado, responda ao e-mail
da fatura (ou escreva para `suporte@plicflix.com`) com o número da fatura:
mandamos o Pix ou o boleto. A equipe dá baixa e você recebe o e-mail
"Pagamento confirmado".
- **Enquanto isso:** você já pode ler toda a documentação, baixar o SDK e os
exemplos e montar a integração. Só cadastrar jogo e gerar a chave esperam o
pagamento.
### 3. Gerar a chave de integração
- **Onde:** painel → **Gerar chave**.
- **O quê:** uma chave `pk_…`. **Aparece uma vez.** Guarde no seu servidor
como variável de ambiente `PLICFLIX_CHAVE`. Nunca ponha no navegador, no app
nem no git.
- **Perdeu?** Gere outra: a antiga para de funcionar na hora.
### 4. Cadastrar o jogo
- **Onde:** painel → **Novo jogo** (`/jogos/novo`).
| campo | exemplo | regra |
|---|---|---|
| nome | `Ilha das Luzes` | até 60 letras |
| identificador (slug) | `ilha-das-luzes` | minúsculas, números e `-`; não muda depois; volta como `jogo` na troca do token |
| endereço | `https://ilha.exemplo.com/` | https; **para testar, pode ser** `http://localhost:4100/` |
| rota de status | `https://ilha.exemplo.com/saude` | responde 200 rápido; a vigia consulta a cada minuto |
- **Deu certo quando:** o jogo aparece no painel com a situação **rascunho**
(não publicado).
- **O endereço muda depois** (aba **Integração → Endereço do jogo**), enquanto
o jogo estiver em rascunho ou recusado. O slug não muda nunca.
### 5. Integrar o navegador (o SDK)
Baixe [`plicflix.js`](/sdk/plicflix.js?baixar=1) para o seu site (sem mudar
nada) e carregue **antes** do jogo. Na ordem:
```js
// jogo.js — carregado com
```
```js
// jogo.js (um módulo: pode usar await)
if (Plicflix.dentro()) {
Plicflix.progresso(10, "Entrando…");
try {
await Plicflix.entrar("/api/plicflix/entrar"); // o SEU servidor troca o token e cria a sessão
} catch (e) {
// não deu (token vencido, ou recarregou depois de entrar): use a sessão que já existe
// ou mostre o seu login de sempre
}
Plicflix.aoSair(() => salvarProgresso()); // o "Sair" da bolha espera você salvar
}
// … carregue o jogo …
Plicflix.pronto(); // tira a tela de carregamento do plicflix
```
**No servidor (Node, com Express):**
```js
import express from "express";
import { trocarIngresso } from "./plicflix.mjs"; // https://developers.plicflix.com/sdk/plicflix.mjs?baixar=1
const app = express();
app.use(express.json());
app.post("/api/plicflix/entrar", async (req, res) => {
let r;
try {
r = await trocarIngresso(req.body.token); // lê PLICFLIX_CHAVE e PLICFLIX_API do ambiente
} catch (e) {
return res.status(e.status === 401 ? 401 : 502).json({ erro: "abra o jogo de novo pelo plicflix" });
}
if (r.jogo !== "meu-jogo") return res.status(401).end(); // o seu slug
// ache ou crie a conta pelo r.jogador.id ("pf_…", fixo) e guarde o r.jogador.nome
const conta = await suaFuncaoAcharOuCriarConta(r.jogador.id, r.jogador.nome);
const sessao = await suaFuncaoCriarSessao(conta);
// o cookie do iframe (escrito à mão: a opção "partitioned" do res.cookie só existe no Express 5)
res.setHeader("Set-Cookie", `sessao=${sessao}; Path=/; HttpOnly; Secure; SameSite=None; Partitioned; Max-Age=2592000`);
res.json({ ok: true });
});
```
**Exemplo completo e executável** (Node sem dependências, ou Go): baixe
[`exemplo-node.zip`](/sdk/exemplo-node.zip) ou [`exemplo-go.zip`](/sdk/exemplo-go.zip).
Rode com `PLICFLIX_CHAVE=pk_… node server.mjs` e siga o README de dentro.
**E a permissão para o plicflix abrir o jogo**, que é o [passo 5](#5-deixar-o-plicflix-abrir-o-seu-jogo).
Com isso o jogo já funciona no plicflix. Os passos 9 e 10 (onde o jogador
está, amigos) deixam a experiência completa.
---
## 4. Entrada: o jogador já chega logado
### O que chega no endereço
O app abre `https://seu-jogo/?ref=plicflix#plicflix=pft_…&pf_idioma=pt-BR&pf_plataforma=android`.
- **`?ref=plicflix`:** vai para o seu servidor. Use nas suas métricas.
- **O fragmento (`#…`):** o navegador **nunca** envia ao seu servidor, então o
token não aparece nos seus logs. O SDK lê o token e **apaga** o fragmento da
barra de endereço.
### O token
- **Formato:** `pft_` seguido de 43 caracteres. É opaco: não carrega dado
nenhum.
- **Validade:** **5 minutos ou uma troca**, o que vier primeiro.
- **Recarregar a página:** antes da troca, o SDK guarda o token no
`sessionStorage` da aba. Depois da troca, `Plicflix.token()` vem `null` e o
jogador segue com a **sua** sessão. `Plicflix.dentro()` continua `true`, por
causa do `?ref=plicflix`.
### A troca, no seu servidor
```
POST https://api.plicflix.com/v1/ingresso/trocar
Authorization: Bearer pk_…
Content-Type: application/json
{ "token": "pft_…" }
```
**200**:
```json
{ "jogador": { "id": "pf_…", "nome": "Paulo" }, "jogo": "seu-slug", "partida": "pt_…",
"assinante": true, "contexto": { "ref": "plicflix", "idioma": "pt-BR", "plataforma": "web" } }
```
**401**: o token é inválido, venceu, já foi trocado ou é de um jogo de outro
parceiro. É sempre a mesma resposta, de propósito, para não ajudar quem tenta
adivinhar tokens.
Os ajudantes já prontos (só a biblioteca padrão; leem `PLICFLIX_CHAVE` e
`PLICFLIX_API` do ambiente):
- **Node 18+:** [`plicflix.mjs`](/sdk/plicflix.mjs?baixar=1) →
`await trocarIngresso(token)`;
- **Go:** [`plicflix.go`](/sdk/plicflix.go?baixar=1) →
`plicflix.DoAmbiente().Trocar(ctx, token)`.
Outra linguagem? É um POST comum, como acima. Erros: `401` (token ruim, de
propósito sem detalhe), `400` (corpo inválido), `429` (limite), `5xx` (tente de
novo).
### A conta
- **Chave:** ligue a conta do seu jogo a `jogador.id`, numa coluna única (por
exemplo `contas.plicflix_id`).
- **Sem senha utilizável:** quem entra pelo plicflix não precisa de senha. Gere
uma senha aleatória que ninguém conhece.
- **Reserve o login interno:** se o login for um e-mail, use um domínio que
ninguém consiga cadastrar (por exemplo `pf_…@plicflix.invalid`) e recuse esse
domínio no seu cadastro normal. Sem isso, alguém poderia criar a conta antes
e tomar o lugar do jogador.
- **O apelido muda:** atualize o nome a cada entrada.
- **Confira o jogo:** confira `jogo == seu slug` antes de abrir a sessão.
---
## 5. Deixar o plicflix abrir o seu jogo
Na web, o app abre o jogo num `