Pular para o conteúdo

Catálogo de demonstração. Produtos, criadores, preços e avaliações são fictícios. Recursos gratuitos podem ser adquiridos de verdade; itens pagos não são cobrados nem simulados. Ver o que já funciona

API REST

Versionada em /api/v1/licensing. A especificação OpenAPI é gerada a partir do código.

Envelope de resposta

json
// Sucesso
{ "ok": true, "data": { ... } }

// Falha
{ "ok": false, "error": { "code": "license_expired", "message": "Licença expirada.", "details": { ... } } }

Decida pelo code, não pelo status HTTP

Proxies reescrevem status, portais cativos de hospedagem devolvem 200 com HTML, e um cliente que confia só no código HTTP quebra na rede dos seus clientes. O code é contrato e nunca muda; a message é texto para humano e pode mudar a qualquer momento.

Autenticação

GrupoComo autenticaQuem chama
ClienteA própria chave de licença, no corpoO SDK, do servidor do comprador
CompradorCookie de sessãoO painel, no navegador
DesenvolvedorAuthorization: Bearer lsk_live_…O seu servidor, ou o painel
Chaves públicasnenhumaQualquer um

Escopos de chave de API

EscopoPermite
plugins:readLer plugins
plugins:writeCriar e alterar plugins
licenses:readLer licenças
licenses:writeEmitir, revogar e suspender licenças

Chave de API nunca entra em um .jar

Quem a tiver age como você: cria plugins, emite e revoga licenças. Ela vive no seu servidor, em variável de ambiente. O plugin distribuído não precisa dela — ele autentica com a chave de licença do próprio cliente.

Explorador

As rotas abertas podem ser executadas daqui. As autenticadas vêm com o curl pronto para o seu terminal.

GET/api/v1/licensing/.well-known/keyssem credencial

Aberto. É daqui que o SDK baixa as chaves com que verifica as assinaturas. Execute agora mesmo.

curl
curl https://179.66.142.109/api/v1/licensing/.well-known/keys

Endpoints

Cliente — chamados pelo SDK

MétodoCaminhoO que faz
POST/licenses/activateRegistra a instalação, consome vaga, devolve a primeira autorização.
POST/licenses/validateRenova uma instalação já ativa. Não cria instalação.
POST/licenses/heartbeatSinal de vida. Só assina quando a sessão está perto de vencer.
POST/licenses/deactivateLibera a instalação a partir do servidor.
GET/.well-known/keysChaves públicas de verificação. Aberto.

Comprador — sessão

MétodoCaminhoO que faz
GET/licenses/meLicenças da conta autenticada.
GET/licenses/:idDetalhe de uma licença própria.
GET/licenses/:id/installationsInstalações da licença.
POST/licenses/:id/reset-installationDesvincula uma instalação, liberando a vaga.

Desenvolvedor — chave de API ou sessão

MétodoCaminhoEscopo
GET/developer/pluginsplugins:read
POST/developer/pluginsplugins:write
GET/developer/plugins/:idplugins:read
PATCH/developer/plugins/:idplugins:write
GET/developer/plugins/:id/licenseslicenses:read
POST/developer/licenseslicenses:write
POST/developer/licenses/:id/revokelicenses:write
POST/developer/licenses/:id/suspendlicenses:write
POST/developer/licenses/:id/reactivatelicenses:write

Autorização é por recurso

Ter credencial válida não é permissão. Toda leitura e toda escrita carregam o recurso com o sellerId do contexto dentro da consulta — não carregam e depois comparam.

Um identificador de outro vendedor simplesmente não encontra linha, e a resposta é 404, não 403: dizer “existe, mas não é seu” confirmaria a existência do recurso alheio.

Paginação

http
GET /developer/plugins?page=2&pageSize=50&status=ACTIVE&q=aurum
json
{
  "ok": true,
  "data": {
    "items": [ ... ],
    "page": 2,
    "pageSize": 50,
    "total": 137,
    "totalPages": 3
  }
}

pageSize tem teto de 100. Sem teto, um cliente pede tudo e derruba a consulta.

Rate limits

RotaPor IPPor chave
activate60 / 15 min20 / 15 min
validate300 / 15 min120 / 15 min
heartbeat600 / 15 min—
deactivate60 / 15 min—
developer (leitura)600 / 15 min600 / 15 min
developer (escrita)120 / 15 min120 / 15 min

O limite por chave é o que importa de verdade. Uma chave legítima ativa uma vez por servidor por boot; vinte tentativas em quinze minutos com a mesma chave é redistribuição ou laço de erro.

Ao estourar, a resposta é 429 com Retry-After em segundos. O SDK já respeita esse cabeçalho.

Versionamento

  • O caminho carrega a versão: /api/v1/licensing. Uma v2 coexistiria com a v1 enquanto houvesse cliente usando.
  • O protocolo de autorização tem versão própria, dentro do documento assinado. O prefixo LSA1 entra na assinatura, então um documento da versão 1 nunca pode ser reapresentado como de uma versão futura.
  • Acrescentar campo à resposta não é mudança de versão. Remover campo, mudar significado ou mudar código de erro, sim.
  • Toda resposta leva X-Licensing-Version.

OpenAPI

A especificação completa está em /api/v1/licensing/openapi. Ela é gerada: os códigos de erro, os escopos e os eventos de webhook são importados dos módulos que os definem, então acrescentar um código de erro o faz aparecer na especificação sozinho.

bash
# Gerar um cliente a partir da especificação
npx @openapitools/openapi-generator-cli generate \
  -i https://179.66.142.109/api/v1/licensing/openapi \
  -g typescript-fetch \
  -o ./lodestone-client