Pular para o conteúdo principal

Status: Approved · v2 · SPEC-API-FINANCE-001

depends_on: SPEC-DOMAIN-WALLET-001, SPEC-DOMAIN-PAYMENT-001, SPEC-DOMAIN-SPONSOR-001

used_by: IS-MVP-09.1, IS-MVP-09.2, IS-MVP-09.3, IS-MVP-09.4, IS-MVP-10.1, IS-MVP-10.2

API de carteira, apoio, pagamentos e patrocínio

Fluxos financeiros rastreáveis, idempotentes e sem linguagem/semântica de aposta ou saque.

Princípios e padrões

  • Base path /api/v1; JSON UTF-8; chaves em camelCase.
  • Toda resposta usa ApiResponse<T> com ok, data|error e meta contendo requestId e timestamp.
  • IDs são strings opacas; datas são ISO-8601 UTC; dinheiro é inteiro em centavos com moeda BRL.
  • Listas usam page e pageSize no MVP; default 20, máximo 100; metadados ficam em meta.pagination.
  • Endpoints públicos usam DTOs públicos específicos; entidades internas, memberships, saldos e dados privados nunca vazam.
  • Erros de domínio são estáveis e acionáveis; stack traces e detalhes internos não são retornados.
  • Alterações sensíveis usam Idempotency-Key, confirmação recente quando necessário e audit log.
  • Uploads usam fluxo presigned; o backend valida propósito, MIME, tamanho e ownership antes de confirmar o asset.

Endpoints

MétodoRotaAcessoRequestResponseRegras principais
GET/wallets/:ownerType/:ownerIdwallet.viewWalletResponseSaldo disponível/a expirar; sem float.
GET/wallets/:ownerType/:ownerId/entrieswallet.viewLedgerLedgerQueryWalletEntriesResponseExtrato privado.
POST/wallets/:ownerType/:ownerId/usewallet.useCreditsUseCreditsRequestWalletTransactionResponseAção paga interna.
POST/wallets/:ownerType/:ownerId/transferswallet.transferTransferCreditsRequestWalletTransferResponseApenas team↔torcida vinculada.
POST/supportPúblicoCreateSupportRequestPaymentResponseAnônimo ou identificado.
POST/payments/pixPúblico/contextualCreatePixPaymentRequestPaymentResponsePurpose validado.
GET/payments/:paymentIdPúblico com secure token ou ownerPaymentResponseStatus/expiração.
POST/payments/:paymentId/check-statusContextualPaymentResponseNão confirma pelo cliente.
POST/webhooks/pix/:providerProvider signedProviderWebhookPayloadOperationResponseIdempotente e autenticado.
GET/:entityType/:entityId/sponsorship/availabilityPúblicoSponsorAvailabilityResponse3 slots incluindo reservas pending.
POST/sponsorshipsPúblicoCreateSponsorshipRequestPaymentResponsePacote e conteúdo.
PATCH/sponsorships/:id/contentsponsor/manage entityUpdateSponsorContentRequestSponsorshipResponseDados visuais; não pausa/remove ativo no MVP.

Autenticação e autorização

  • Wallet e ledger exigem permissions.
  • Support/sponsor checkout pode ser anônimo; identified support exige auth.
  • Webhook usa assinatura/provider allowlist.

Erros de domínio

CódigoHTTPQuando ocorreAção esperada no cliente
INSUFFICIENT_CREDITS409Saldo disponível menorMostrar necessidade.
TRANSFER_NOT_ALLOWED422Entidades não vinculadas/direção inválidaBloquear.
PAYMENT_EXPIRED410Pix expiradoGerar novo.
PAYMENT_ALREADY_PROCESSED409Efeito já aplicadoExibir status.
SPONSOR_LIMIT_REACHED4093 slots ativos/pendingNão abrir checkout.
INVALID_SUPPORT_AMOUNT422Fora dos valores/regrasCorrigir.

Idempotência e concorrência

  • Todas as POST financeiras exigem key.
  • Webhook event ID único; payment transition monotônica.
  • Credits consumption usa FIFO em transação.

Auditoria e efeitos colaterais

  • Ledger é audit trail financeiro; audit log cobre actor/admin changes.
  • Paid support/sponsor cria credit lots com splits; campeonato não cria wallet credit.

Exemplos

support

{
"targetType": "team",
"targetId": "team_001",
"amount": {
"amountInCents": 2000,
"currency": "BRL"
},
"identityMode": "anonymous"
}

payment

{
"id": "payment_001",
"purpose": "donation_support",
"status": "waiting_payment",
"amount": {
"amountInCents": 2000,
"currency": "BRL"
},
"pix": {
"copyPasteCode": "000201...",
"expiresAt": "2026-07-12T18:30:00.000Z"
}
}

Mocks

  • Fake provider permite waiting/paid/expired/failed.
  • Clock control para expiração e credit lots.
  • Ledger stateful e resetável.

Testes obrigatórios

  • 95/5 support split.
  • 80/20 sponsor split.
  • Champ publication no wallet.
  • FIFO expiration.
  • Webhook duplicate.
  • Slot reservation.
  • Anonymous privacy.

Critérios de aceite

  • Nenhum fluxo permite saque.
  • Valores e splits corretos.
  • Cliente nunca confirma pagamento.
  • Máximo de 3 sponsors.

Machine summary

spec: SPEC-API-FINANCE-001
api_group: API de carteira, apoio, pagamentos e patrocínio
base_path: /api/v1
response_envelope: ApiResponse<T>
ids: string
dates: ISO-8601
money: integer_cents