Transações
CRUD de transações financeiras.
Visao geral
Rotas para criar, listar, obter, atualizar e excluir (soft delete) transacoes financeiras.
- Base:
https://api.ascendteam.cloud/api/v1/transactions - Autenticacao: requer sessao/credenciais validas do Better Auth (ver
/docs/api/auth).
Modelo (campos principais)
id(UUID)userId(UUID)categoryId(UUID, opcional)familyMemberId(UUID, opcional)amount(decimal)type(INCOME | EXPENSE)date(data/hora)description(opcional)serviceCategoryId(UUID, opcional; apenas para transacoesEM_ABERTO)paymentMethod(DEBIT_CARD | CREDIT_CARD_ONE_TIME | CREDIT_CARD_INSTALLMENTS | EM_ABERTO, opcional)originDebtId(UUID, opcional; referencia a divida criada quando em aberto)isInstallmentParent(boolean, default false)installmentsCount(number, opcional)installmentBillingStart(CURRENT_MONTH | NEXT_MONTH, opcional)firstInstallmentDueDate(date, opcional)recurrenceRuleId(UUID, opcional; preenchido quando a transacao origina uma regra recorrente)idempotencyKey(string, opcional; recomendado sempre e obrigatório para parcelado via header)deletedAt(opcional)createdAtupdatedAt
Endpoints
POST /
Cria uma nova transacao.
Body
amount(number, obrigatorio)type(INCOME | EXPENSE, obrigatorio)date(date, opcional)description(string, opcional)categoryId(UUID, opcional)familyMemberId(UUID, opcional)debtorId(UUID, opcional; usado quando paymentMethod=EM_ABERTO)serviceCategoryId(UUID, opcional; permitido apenas quandopaymentMethod=EM_ABERTO)paymentMethod(DEBIT_CARD | CREDIT_CARD_ONE_TIME | CREDIT_CARD_INSTALLMENTS | EM_ABERTO, opcional)installmentPlan(object, opcional; obrigatório quandopaymentMethod=CREDIT_CARD_INSTALLMENTS)count(number, obrigatório; ex.: 2–24)billingStart(CURRENT_MONTH | NEXT_MONTH, obrigatório)firstDueDate(date, opcional)
recurrencePlan(object, opcional; indisponível para parcelado)periodicity(DAILY | MONTHLY | YEARLY, obrigatório)interval(number, obrigatório; mínimo 1)repeatCount(number, opcional; quando omitido, a recorrencia pode ser indefinida)indefinite(boolean, obrigatório)
idempotencyKey(string, opcional no body; o headerIdempotency-Keycontinua sendo o formato preferencial)
Respostas
- 201: transacao criada
- 400: dados invalidos
Parcelamento (crédito)
- Quando
paymentMethod=CREDIT_CARD_INSTALLMENTS, a API cria:- 1 transação-mãe (
isInstallmentParent=true,amount=total) - N parcelas vinculadas (valores que somam exatamente o total)
- 1 transação-mãe (
- Na contagem mensal (dashboard/relatórios), somamos apenas o valor das parcelas do mês (nunca o total da transação-mãe).
- Idempotência: envie o header
Idempotency-Key(obrigatório para parcelado) para evitar duplicidade em retries.
Em aberto
- Quando
paymentMethod=EM_ABERTO, a transacao representa uma intencao de recebimento. - Transacoes em aberto nao entram nos totais ate serem pagas.
- Ao informar
debtorId, a API cria automaticamente uma dividaABERTAvinculada emoriginDebtId. serviceCategoryIdso e aceito nesse modo e tambem e propagado para a divida criada.- Ao pagar, a mesma transacao deve ser atualizada para o metodo real e vinculada a uma alocacao.
GET /
Lista transacoes (paginado).
Query
type(INCOME | EXPENSE, opcional)categoryId(UUID, opcional)from(date ISO 8601, opcional)to(date ISO 8601, opcional)page(number, opcional, default 1)pageSize(number, opcional, default 20, max 100)includeDeleted(boolean, opcional, default false)
Resposta 200
total,page,pageSize,items(array de transacoes)
GET /export
Exporta transacoes em CSV ou PDF.
Query
type(INCOME | EXPENSE, opcional)categoryId(UUID, opcional)familyMemberId(UUID, opcional)serviceCategoryId(UUID, opcional)from(date ISO 8601, opcional)to(date ISO 8601, opcional)includeDeleted(boolean, opcional, default false)format(csv | pdf, opcional, default csv)fields(lista separada por virgula; ex.:date,amount,categoryName)
Resposta 200
- Buffer do arquivo
Content-Type:text/csvouapplication/pdfContent-Disposition:attachment; filename="transacoes-..."
POST /import-csv
Faz upload de CSV de faturas pessoais para staging.
Query
source(string, opcional)delimiter(string, opcional; 1 caractere)negativeMode(IGNORE|AS_INCOME|AS_ADJUSTMENT, opcional)installmentAmountMode(PER_INSTALLMENT|TOTAL, opcional; defaultPER_INSTALLMENT)saveTemplate(boolean, opcional)
Body
multipart/form-datacom campofile
Resposta 201
- Lote de importacao com contadores (
totalRows,validRows,invalidRows).
POST /import-document
Faz upload de CSV, OFX, PDF ou XLSX para importacao de transacoes.
Query
sourceType(CSV|OFX|PDF|XLSX, opcional; inferido por extensao/magic quando omitido)source(string, opcional)delimiter(string, opcional; 1 caractere, apenas CSV)negativeMode(IGNORE|AS_INCOME|AS_ADJUSTMENT, opcional; CSV/XLSX)installmentAmountMode(PER_INSTALLMENT|TOTAL, opcional; CSV/XLSX)saveTemplate(boolean, opcional)bankCode(BB|CAIXA|BRADESCO|NUBANK|INTER|ITAU|SANTANDER, opcional; obrigatório para PDF)pdfPassword(string, opcional; usado para PDF protegido)sheetName(string, opcional; nome da aba para XLSX)
OFX
- Formato preferencial para extratos bancários.
- Quando presente,
FITIDparticipa da chave de idempotênciaofx:{bank}:{acct}:{fitId}. - Reimportação da mesma chave resulta em
SKIPPED, inclusive se a transação foi soft-deleted.
XLSX
- Aceita
.xlsxe.xlsm; arquivos.xlslegados não são suportados. - Para Google Sheets, use Arquivo → Baixar → Microsoft Excel (
.xlsx). - O importador detecta a aba mais provável, o cabeçalho e templates
SIMPLE_STATEMENT/MONTHLY_SPEND.
Body
multipart/form-datacom campofile
Resposta 201
- Lote de importacao criado.
- Para PDF, o lote pode retornar
documentStatus=PENDING_PROCESSINGate o parser finalizar.
GET /imports/:id
Busca um lote de importacao.
Campos adicionais
documentStatus(PENDING_PROCESSING|PROCESSED|PROCESSING_FAILED|INVALID_PASSWORD, opcional)
GET /imports/:id/rows
Lista linhas do lote.
Query
status(PENDING|INVALID|COMMITTED|SKIPPED|FAILED, opcional)page(number, opcional)pageSize(number, opcional)
PATCH /imports/:id/configuration
Atualiza configuracao de mapeamento para o lote e reprocessa as linhas.
Body
columnMapping(objeto opcional com chavesdate,description,amount,installmentIndex,installmentsCount)negativeMode(IGNORE|AS_INCOME|AS_ADJUSTMENT, opcional)installmentAmountMode(PER_INSTALLMENT|TOTAL, opcional)saveTemplate(boolean, opcional)
Regra de parcelamento no import
- Quando uma linha tiver parcela (ex.:
Parcela 1/3), o sistema considera por padrão que o valor do CSV é valor da parcela. - Com
installmentAmountMode=PER_INSTALLMENT(default), o total da compra viravalor * totalParcelas. - Com
installmentAmountMode=TOTAL, o valor do CSV já é tratado como total da compra.
PATCH /imports/:id/rows/:rowId
Edita uma linha do staging e revalida status/erros.
Body
date(date, opcional)amount(number, opcional)description(string, opcional)
POST /imports/:id/commit
Confirma importacao do lote.
POST /imports/:id/reprocess
Reprocessa um lote PDF que falhou por senha invalida.
Body
pdfPassword(string, obrigatorio)
GET /:id
Busca uma transacao por ID.
Params
id(UUID)
Respostas
- 200: transacao encontrada
- 404: transacao nao encontrada
Detalhe de parcelado
- Se
isInstallmentParent=true, a resposta incluiinstallments: []com as parcelas (ordenadas).
PATCH /:id
Atualiza campos da transacao.
Params
id(UUID)
Body
amount(number, opcional)type(INCOME | EXPENSE, opcional)date(date, opcional)description(string, opcional)categoryId(UUID, opcional)familyMemberId(UUID, opcional)serviceCategoryId(UUID, opcional; permitido apenas quando o metodo efetivo forEM_ABERTO)paymentMethod(DEBIT_CARD | CREDIT_CARD_ONE_TIME | CREDIT_CARD_INSTALLMENTS | EM_ABERTO, opcional)
Respostas
- 200: transacao atualizada
- 404: transacao nao encontrada
Regras de atualizacao
paymentMethod=CREDIT_CARD_INSTALLMENTSnao pode ser definido viaPATCH.paymentMethod=EM_ABERTOso e permitido para transacoes do tipoINCOME.- Transacoes parceladas (
isInstallmentParent=true) nao aceitam alteracao de valor, tipo, data ou metodo de pagamento; nesse caso, edite apenas descricao/categoria/membro.
DELETE /:id
Soft delete da transacao.
Params
id(UUID)
Respostas
- 200: transacao deletada
- 404: transacao nao encontrada
Observacoes
- Soft delete preenche
deletedAt.