Documentação da API ADECOINS

Carteira central de pontos de fidelidade (off-chain). 1 AC = R$ 1,00.


API pública HMAC — /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

Headers obrigatórios

HeaderObrigatórioDescrição
X-Merchant-Idsimslug (ex: adeplay) ou uuid do merchant
X-Key-IdsimPublic key (ak_...) gerada em /admin/keys
X-Secretsim (MVP)Secret key (sk_...) — exibido uma única vez ao criar a key
X-Signaturesimhex(HMAC_SHA256(rawBody, secret)). Para GET, assinar string vazia
X-Idempotency-Keyrecomendado em POSTUUID v4 único por operação lógica; retente com a mesma key para receber a mesma resposta cacheada
Content-TypePOSTapplication/json

Observações

Como assinar (Node.js)

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,
});

Como assinar (bash)

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}'
}

Endpoints

GET /wallet — consulta saldo

Body 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, ... }

POST /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.

POST /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"

POST /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"

POST /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"

POST /refund — estornar transação confirmada

BODY='{"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.


Códigos de erro

StatusSituação
400Payload inválido / parâmetros faltando
401Header ausente, key inválida, secret errado ou assinatura não confere
403Merchant existe mas está inativo
409X-Idempotency-Key reusada com payload diferente
500Erro interno

Credenciais

Gere/rotacione em /admin/keys (requer role admin):

Botão Rotacionar cria uma nova key e revoga a anterior atomicamente.