CAMT.053 & MT940 Converter
Pricing
from $100.00 / 1,000 statement validateds
CAMT.053 & MT940 Converter
Convert CAMT.053 and MT940 bank statements from inline text or public URLs into deterministic JSON and balance-reconciled CSV with stable transaction IDs. Built for finance and integration teams; no bank login or OCR.
Pricing
from $100.00 / 1,000 statement validateds
Rating
0.0
(0)
Developer
Cedric Günther
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
Converts bounded CAMT.053 and a documented MT940 subset into stable transaction JSON, RFC 4180 CSV, and explicit balance-reconciliation evidence. It is built for accounting-data engineers, treasury operations teams, financial integration developers. The main result is structured, deterministic evidence that can be consumed from the default dataset or an Apify automation.
When to use this Actor
- Normalize machine-readable bank exports before accounting-system import.
- Reconcile opening balance, transactions, and closing balance with an explicit PASS, FAIL, or INCONCLUSIVE result.
- Produce stable JSON and CSV artifacts for repeatable statement-processing tests.
How it works
- Validate each inline statement or credential-free public HTTPS source and detect or enforce its declared format.
- Parse the supported CAMT.053 namespace variants or MT940 subset into deterministic statements and transaction identifiers.
- Persist statement/transaction rows plus canonical JSON and CSV; isolate a malformed statement so other batch items can complete.
The Actor validates only the declared product contract. It does not infer facts outside the supplied data or claim outcomes that the source material cannot prove.
Quick start
- Open the Actor's Input tab or create a Task from one of the public examples.
- Paste or adapt this bounded example.
- Click Start and inspect the default dataset plus the output links shown on the run page.
{"statements": [{"sourceId": "statement-2026-09","format": "MT940","content": ":20:STMT-1\n:25:DE02120300000000202051\n:60F:C260901EUR100,00\n:61:2609150915C12,34NTRFREF-1//BANK-1\n:86:Invoice 1\n:62F:C260930EUR112,34\n-"}],"mode": "strict","maxFileBytes": 2000000,"maxTransactionsPerStatement": 10000}
Expected result: one PASS statement row, one transaction row, canonical JSON, and a CSV artifact.
Input
The quick-start example is intentionally small. These are the material controls; the Input tab remains authoritative for the complete current schema.
| Field | Purpose and format | Default | Important bounds or interaction |
|---|---|---|---|
statements | Bounded list of statement sources, each carrying a stable source ID and either inline content or a permitted public HTTPS URL. | No implicit default | minimum items 1; maximum items 20 |
mode | Controls whether supported data-quality findings fail the statement or are retained as review evidence under the declared mode. | "strict" | one of strict, tolerant |
maxFileBytes | Per-statement download or inline byte ceiling applied before parsing to protect memory and runtime. | 2000000 | minimum 1024; maximum 5000000 |
maxTransactionsPerStatement | Maximum transaction entries accepted from one statement before that statement fails closed. | 10000 | minimum 1; maximum 10000 |
fetchTimeoutSecs | Network timeout applied only to permitted HTTPS statement retrieval; it does not extend the overall Actor timeout. | 10 | minimum 1; maximum 30 |
Unknown top-level fields and invalid field combinations fail validation rather than being guessed.
Output
The default dataset contains typed records. The run's Output tab links the dataset and any key-value-store reports declared by the current output schema.
| Field | Meaning |
|---|---|
recordType | Identifies statement and transaction rows. |
sourceId | Current dataset field. |
status | Current dataset field. |
formatVersion | Current dataset field. |
statementId | Current dataset field. |
accountId | Current dataset field. |
currency | Current dataset field. |
openingBalance | Current dataset field. |
closingBalance | Current dataset field. |
calculatedClosingBalance | Current dataset field. |
reconciliationDifference | Current dataset field. |
reconciliationStatus | PASS, FAIL, or INCONCLUSIVE balance evidence; absence of balances is never called reconciled. |
transactionCount | Current dataset field. |
transactionId | Current dataset field. |
bookingDate | Current dataset field. |
amount | Decimal string retained without binary floating-point conversion. |
creditDebit | Current dataset field. |
reference | Current dataset field. |
errorCode | Current dataset field. |
engineVersion | Current dataset field. |
Representative current-schema dataset item:
{"recordType": "transaction","sourceId": "statement-2026-09","status": "PASS","formatVersion": "MT940","statementId": "STMT-1","currency": "EUR","transactionId": "example-stable-id","bookingDate": "2026-09-15","amount": "12.34","creditDebit": "CREDIT","reference": "REF-1","engineVersion": "1.0.0"}
A syntactically valid statement with no transactions can still produce a statement row; its reconciliation status follows the available balance evidence.
Pricing and billing
This Actor uses PAY_PER_EVENT; platform usage is included in event prices. A charge is eligible only after the billable unit described below is durably completed. Validation failures and the non-billable failure classes in the product contract do not emit the custom completion event. The current live policy uses the same event price at every Store tier; no tier discount is active. The Apify Pricing tab is authoritative if a later approved pricing change takes effect.
| Event | What triggers it | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|---|
statement-validated | Charged once after one input statement reaches a final parse and reconciliation result and durable output is written. | $0.10000000 | $0.10000000 | $0.10000000 | $0.10000000 | $0.10000000 | $0.10000000 |
apify-actor-start | Platform-managed Actor start event. | $0.00005000 | $0.00005000 | $0.00005000 | $0.00005000 | $0.00005000 | $0.00005000 |
The Actor does not have Task-specific prices: public Tasks use this same live Actor pricing. Third-party costs are not implied; see the data and security section for external services actually contacted.
Limits and bounds
- The public build supports the exact format namespaces/subset and bounds shown in the current Input schema; lower caller limits are allowed.
- Exactly one of content or a credential-free public HTTPS URL is accepted per statement; redirects and private/reserved destinations are rejected.
- PDF, OCR, bank login, SFTP, and arbitrary bank-specific narrative semantics are outside the public contract.
These are product-facing limits, not targets. Use smaller inputs when you need faster feedback or simpler evidence.
Failure and edge-case behavior
- Invalid top-level configuration fails before processing; a malformed individual statement becomes a FAILED statement row while other items continue.
- DOCTYPE/entity XML, unsupported namespace, unsafe URL, oversized content, invalid decimal/date, or entry-limit breach fails closed.
- Missing opening or closing balance produces INCONCLUSIVE reconciliation rather than a false PASS.
Operationally:
- Prefer inline input for confidential statements and configure Apify retention for the resulting dataset and key-value records.
- Reprocessing identical content with the same sourceId yields stable identifiers and output ordering.
Use with Tasks and automation
Public Tasks provide reusable saved inputs for distinct supported workflows. Start with the closest Example Task, review its visible fields and scope caveat, then save your own Task for schedules or repeated runs. Do not treat an Example Task as evidence that unsupported behavior exists.
- Convert a bank statement to reconciled CSV: Parse a safe synthetic MT940 statement, emit deterministic transactions, and verify opening-to-closing balance consistency.
- Convert CAMT.053 to deterministic JSON: Parse a synthetic CAMT.053.001.08 statement into stable canonical records with deterministic transaction IDs and reproducible JSON output.
- Validate and reconcile an MT940 bank statement: Validate a synthetic MT940 statement, normalize its transactions, and check opening balance plus booked entries against the closing balance.
- The Actor page contains 1 additional public Example Task workflow(s).
Integration and API usage
Every saved Task can be started manually, through the Apify API, or from an Apify schedule. Run-completion webhooks can notify a downstream system after output is durable. Actor-to-Actor calls should consume the typed dataset/output links instead of scraping the Store page.
- Use CANONICAL_JSON for normalized downstream processing and TRANSACTIONS_CSV for RFC 4180-compatible imports.
- Route statement reconciliationStatus explicitly instead of treating every successful Actor run as reconciled data.
No third-party integration is claimed unless it is named above and supported by the current product contract.
Data, privacy, and security
- Statement content can be sensitive and is stored in the run's Apify input/output surfaces under account retention settings.
- The Actor sends no statement content to third-party services and accepts no bank credentials.
Set Apify storage retention and access according to the sensitivity of your inputs and outputs. This documentation does not create legal, privacy, compliance, or security certification.
Support and known limitations
- The Actor implements a documented MT940 subset and selected CAMT.053 variants, not every bank extension.
- It does not initiate payments, categorize transactions, certify statements, or provide accounting, tax, legal, fraud, or audit advice.
For support, use the Actor Issues page. Include the run ID, a minimal reproducible input with sensitive values removed, the failing record or error code, and what you expected. Do not post credentials, private source files, customer data, or full confidential payloads.