para integrar
Referência da API
A API REST, os webhooks assinados e a validação de licença. O guia do seller fica em /docs.
API REST
Crie uma chave de API em Loja → Chaves de API. Ela é mostrada uma vez só. Autentique com um token bearer:
curl https://sua-loja.example/api/v1/products \
-H "Authorization: Bearer shuz_live_…"As chaves têm escopo (products:read, orders:write, e assim por diante) e limite de uso por chave. As respostas trazem X-RateLimit-Limit e X-RateLimit-Remaining; uma requisição recusada traz Retry-After. O esquema completo está publicado em /api/v1/openapi.json.
Criar um pedido devolve o endereço de pagamento para você mostrar ao comprador:
POST /api/v1/orders
{
"email": "comprador@exemplo.com",
"asset": "BTC",
"items": [{ "productId": "…", "quantity": 1 }]
}
201
{
"order": { "number": "4KQ7-M2XN-9F3T", "status": "PENDING" },
"invoice": { "address": "bc1q…", "expected": "0.00031312", "expiresAt": "…" }
}O corpo aceita items, que é o mesmo nome que o pedido devolve — então dá para ler um pedido, mudar uma quantidade e mandar de volta. lines continua funcionando, para quem integrou antes; mande um ou outro, nunca os dois. Exemplo que roda:
curl -X POST https://sua-loja.example/api/v1/orders \
-H "Authorization: Bearer shuz_live_…" \
-H "Content-Type: application/json" \
-d '{
"email": "comprador@exemplo.com",
"asset": "BTC",
"items": [{ "productId": "prod_…", "quantity": 1 }]
}'Webhooks
Adicione um endpoint em Loja → Webhooks e assine os eventos que te interessam. Cada entrega carrega:
X-Shuz-Event: order.completed
X-Shuz-Delivery: <id da entrega>
X-Shuz-Timestamp: 1774000000
X-Shuz-Signature: <hex>A assinatura é HMAC-SHA256(timestamp + "." + corpoBruto) usando o segredo do seu endpoint. Verifique antes de confiar no corpo, e recuse um timestamp de mais de alguns minutos, para que uma requisição capturada não possa ser reenviada:
import { createHmac, timingSafeEqual } from 'node:crypto'
const expected = createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex')
const ok = timingSafeEqual(Buffer.from(expected), Buffer.from(signature))Entregas que falham são repetidas com espera crescente. Um endpoint que falha dez vezes seguidas é desativado sozinho, e você é avisado.
Validação de licença
Ative o licenciamento num produto e cada unidade vendida emite uma chave. Seu próprio software confere a chave contra um endpoint público, sem chave de API, porque ele roda na máquina do seu cliente:
POST /api/v1/license/validate
{ "key": "A1B2C-D3E4F-G5H6J-K7L8M", "hardwareId": "…" }
{ "valid": true, "status": "ACTIVE",
"expiresAt": null, "activationsRemaining": 2 }As ativações são vinculadas ao id de hardware que você informa, contadas contra o limite do produto, e revogáveis pelo painel. Uma verificação que falha nunca diz a que loja ou a que produto a chave pertence.