Carteira central de pontos de fidelidade (off-chain). 1 AC = R$ 1,00.
/admin/carteira/api/public/v1/*Todas as rotas de merchants ficam sob o prefixo /api/public/v1 (o prefixo /api/public/ é obrigatório para bypass de auth no site publicado — não use /api/v1).
Base URL de produção:
https://adecoins.lovable.app/api/public/v1
| Header | Obrigatório | Descrição |
|---|---|---|
X-Merchant-Id | sim | slug (ex: adeplay) ou uuid do merchant |
X-Key-Id | sim | Public key (ak_...) gerada em /admin/keys |
X-Secret | sim (MVP) | Secret key (sk_...) — exibido uma única vez ao criar a key |
X-Signature | sim | hex(HMAC_SHA256(rawBody, secret)). Para GET, assinar string vazia |
X-Idempotency-Key | recomendado em POST | UUID v4 único por operação lógica; retente com a mesma key para receber a mesma resposta cacheada |
Content-Type | POST | application/json |
Observações
X-Idempotency-Key com payload diferente retorna 409.import { createHmac, randomUUID } from "node:crypto";
const secret = process.env.ADECOINS_MERCHANT_SECRET!;
const body = JSON.stringify({ email: "cliente@exemplo.com", amount: 10 });
const signature = createHmac("sha256", secret).update(body).digest("hex");
await fetch("https://adecoins.lovable.app/api/public/v1/reserve", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Merchant-Id": "adeplay",
"X-Key-Id": process.env.ADECOINS_API_KEY!,
"X-Secret": secret,
"X-Signature": signature,
"X-Idempotency-Key": randomUUID(),
},
body,
});
export ADECOINS_MERCHANT_SLUG="adeplay"
export ADECOINS_API_KEY="ak_..."
export ADECOINS_MERCHANT_SECRET="sk_..."
sign() {
printf '%s' "$1" | openssl dgst -sha256 -hmac "$ADECOINS_MERCHANT_SECRET" -hex | awk '{print $2}'
}
/wallet — consulta saldoBody vazio, assinar string vazia.
SIG=$(sign "")
curl -i "https://adecoins.lovable.app/api/public/v1/wallet?email=cliente@exemplo.com" \
-H "X-Merchant-Id: $ADECOINS_MERCHANT_SLUG" \
-H "X-Key-Id: $ADECOINS_API_KEY" \
-H "X-Secret: $ADECOINS_MERCHANT_SECRET" \
-H "X-Signature: $SIG"
Resposta:
{ "id": "...", "email": "cliente@exemplo.com", "available": 250.00, "pending": 0, "blocked": 0, ... }
/reserve — reservar saldo (pré-autorização)BODY='{"email":"cliente@exemplo.com","amount":25.50,"external_ref":"pedido-123"}'
SIG=$(sign "$BODY")
curl -i -X POST "https://adecoins.lovable.app/api/public/v1/reserve" \
-H "Content-Type: application/json" \
-H "X-Merchant-Id: $ADECOINS_MERCHANT_SLUG" \
-H "X-Key-Id: $ADECOINS_API_KEY" \
-H "X-Secret: $ADECOINS_MERCHANT_SECRET" \
-H "X-Signature: $SIG" \
-H "X-Idempotency-Key: $(uuidgen)" \
-d "$BODY"
Retorna reservation_id para uso em confirm / cancel.
/confirm — confirmar reserva (débito efetivo)BODY='{"reservation_id":"...","external_ref":"pedido-123"}'
SIG=$(sign "$BODY")
curl -i -X POST "https://adecoins.lovable.app/api/public/v1/confirm" \
-H "Content-Type: application/json" \
-H "X-Merchant-Id: $ADECOINS_MERCHANT_SLUG" \
-H "X-Key-Id: $ADECOINS_API_KEY" \
-H "X-Secret: $ADECOINS_MERCHANT_SECRET" \
-H "X-Signature: $SIG" \
-H "X-Idempotency-Key: $(uuidgen)" \
-d "$BODY"
/cancel — cancelar reserva (libera saldo)BODY='{"reservation_id":"..."}'
SIG=$(sign "$BODY")
curl -i -X POST "https://adecoins.lovable.app/api/public/v1/cancel" \
-H "Content-Type: application/json" \
-H "X-Merchant-Id: $ADECOINS_MERCHANT_SLUG" \
-H "X-Key-Id: $ADECOINS_API_KEY" \
-H "X-Secret: $ADECOINS_MERCHANT_SECRET" \
-H "X-Signature: $SIG" \
-H "X-Idempotency-Key: $(uuidgen)" \
-d "$BODY"
/credit — creditar pontos (cashback / bônus)BODY='{"email":"cliente@exemplo.com","amount":10.00,"description":"Cashback pedido 123","external_ref":"pedido-123"}'
SIG=$(sign "$BODY")
curl -i -X POST "https://adecoins.lovable.app/api/public/v1/credit" \
-H "Content-Type: application/json" \
-H "X-Merchant-Id: $ADECOINS_MERCHANT_SLUG" \
-H "X-Key-Id: $ADECOINS_API_KEY" \
-H "X-Secret: $ADECOINS_MERCHANT_SECRET" \
-H "X-Signature: $SIG" \
-H "X-Idempotency-Key: $(uuidgen)" \
-d "$BODY"
/refund — estornar transação confirmadaBODY='{"transaction_id":"...","amount":25.50,"reason":"Cliente cancelou"}'
SIG=$(sign "$BODY")
curl -i -X POST "https://adecoins.lovable.app/api/public/v1/refund" \
-H "Content-Type: application/json" \
-H "X-Merchant-Id: $ADECOINS_MERCHANT_SLUG" \
-H "X-Key-Id: $ADECOINS_API_KEY" \
-H "X-Secret: $ADECOINS_MERCHANT_SECRET" \
-H "X-Signature: $SIG" \
-H "X-Idempotency-Key: $(uuidgen)" \
-d "$BODY"
amount é opcional — se omitido, estorna o valor total.
| Status | Situação |
|---|---|
400 | Payload inválido / parâmetros faltando |
401 | Header ausente, key inválida, secret errado ou assinatura não confere |
403 | Merchant existe mas está inativo |
409 | X-Idempotency-Key reusada com payload diferente |
500 | Erro interno |
Gere/rotacione em /admin/keys (requer role admin):
ak_...) → ADECOINS_API_KEYsk_...) → ADECOINS_MERCHANT_SECRET (exibido uma única vez)ADECOINS_MERCHANT_SLUG (ex: adeplay)Botão Rotacionar cria uma nova key e revoga a anterior atomicamente.