Incarci CSV sau CAMT.053. Noi parsam, reconciliem soldul si iti dam inapoi tranzactiile ca obiecte curate, gata pentru integrare, reconciliere sau audit.
Raspunsul pe `/transactions` e un array de obiecte normalizate. Fiecare tranzactie pastreaza si payload-ul brut al bancii in `raw`, ca sa poti audita orice decizie de parsare.
Cum arata o tranzactie bancara normalizata — acelasi format indiferent de banca sau format sursa.
credit / debit / fee / interest{ "id": "txn_01HNABC8K2YQX7...", "statement_id": "stmt_01HNDEF9...", "booked_at": "2026-03-15", "value_date": "2026-03-15", "amount": "1250.00", "currency": "RON", "type": "credit", "description": "Transfer primit - factura PDAF 16", "counterparty": { "name": "ACME SRL", "iban": "RO49AAAA1B31007593840000" }, "reference": "PDAF-16", "category": null, "raw": { // payload original CAMT.053, pastrat ca sa poti // audita orice decizie de parsare "EndToEndId": "E2E-1234", "MndtId": "MND-9876", "BankTxCd": "PMNT/RCDT/DMCT" } }
Fluxul e async pentru ca parser-ul ruleaza intr-un job — extrasele mari nu te fac sa astepti pe deschis request HTTP.
POST multipart cu extrasul, codul bancii si formatul. Primesti imediat 202 si un upload_id.
POST /api/v1/uploads
Un job din background alege parser-ul potrivit, extrage tranzactiile si verifica sold initial + sum = sold final. Daca nu iese, primesti eroare explicita.
background worker
Tranzactii normalizate, filtrate dupa upload, statement, interval, valuta, tip. Fara paginare pentru extrase sub 1000 linii.
GET /api/v1/transactions
Incepem cu ce folosim noi in productie — Revolut Business, care acopera 80% din exporturile din Romania. Bancile traditionale vin in v1.1, pe masura ce validam formatele cu utilizatori reali.
| Banca | Format | Extensie | Status |
|---|---|---|---|
| Revolut Business | CAMT.053 | .xml | in productie |
| Revolut Business | CSV | .csv | in productie |
| BCR | MT940 | .sta | planificat v1.1 |
| Banca Transilvania | MT940 | .sta | planificat v1.1 |
| ING | MT940 | .sta | planificat v1.1 |
| Raiffeisen, Unicredit | MT940 / CSV | .sta / .csv | in evaluare |
| Intesa, FirstBank, CEC | v2 (OCR) |
Fiecare statement este validat: opening + sum(signed amounts) = closing. Daca ecuatia nu iese cu toleranta de 0.01, statement-ul e marcat failed si tranzactiile NU sunt inserate.
Dupa luni de greseli tacute pe parser-e ad-hoc, asta e singurul semnal care conteaza.
Fiecare upload, statement si tranzactie e legata de un account_id. Global scope pe Eloquent + policies enforced la nivel de query. Un cont nu poate vedea niciodata datele altui cont.
Nu-ti trebuie workaround-uri cand scalezi de la un client la zece.
Fisierul original e pastrat pe disc numai ca sa poti declansa reparse cand descoperi un bug. Raw-ul din JSON ramane in tranzactii pentru audit, dar il poti arhiva sau sterge oricand.
Nimic nu paraseste workspace-ul tau in afara raspunsurilor API pe care le ceri explicit.
Nu cerem card pentru free plan. Zece extrase pe luna sunt suficiente pentru integrare si o luna de testare reala, atat timp cat nu procesezi un portofoliu intreg de clienti deodata.
Pentru volume mai mari, planurile Starter (100 / luna), Pro (500 / luna) sau Enterprise (nelimitat) sunt disponibile manual — onboarded individual, fara Stripe deocamdata. Scrie-ne si punem la punct un plan.
Toate planurile primesc aceleasi parser-e, aceleasi SLA de reconciliere, aceleasi raspunsuri JSON. Singura diferenta e numarul de upload-uri lunare.
Iti creezi cont, confirmi email-ul si in cinci minute ai primul extras parsat. Daca nu se intampla, scrie-ne si reparam.