Skip to main content
This guide covers how to import transaction data from external sources into Matcher for reconciliation.

Supported formats


Matcher accepts transaction files in three general-purpose formats:
  • CSV: Comma-separated values with headers. Most common for bank exports.
  • JSON: Array of transaction objects. Best for API integrations.
  • XML: Structured elements. Common for enterprise systems.
Beyond these, the upload endpoint also accepts specialized banking formats such as camt053 and the namespaced descriptor keys from the format catalog (CNAB, acquirer layouts). See Import formats for the full catalog.

File structure requirements


Each file must contain transaction records with fields you can map to Matcher’s internal schema.

Required fields

Every transaction must have these fields (or mappable equivalents):

Optional fields

Matcher keeps unmapped columns as transaction metadata.

Format examples


CSV

CSV Requirements:
  • First row must be column headers
  • UTF-8 encoding and comma delimiter by default (configurable)
  • Quote fields containing commas or newlines
Code example

JSON

JSON Requirements:
  • An array of objects, or a single object
  • Consistent field names across objects
  • UTF-8 encoding by default (configurable)
Code example

XML

XML Requirements:
  • Well-formed XML
  • Record elements named transaction, row, record, item, or entry
  • UTF-8 encoding by default (configurable)
Code example

Upload via API


Use the import endpoint to upload transaction files.

Preview before uploading

Before committing a file for ingestion, you can preview it to verify column detection and sample data. This helps catch field mapping issues early.
cURL

Response

API Reference: Preview file

Single file upload

cURL
Send the format field before the file part. If file arrives first, Matcher infers the format from the filename extension for .csv and .json only. Matcher never infers .xml, because it is a format family that covers plain XML and camt.053. Send the explicit format field for XML. Matcher rejects the upload without it. Upload returns 202 Accepted with the created job.
The upload limit is 1 GiB. It counts the whole request body of the upload, including every part, part header, and boundary, not only the file.
API Reference: Upload file

Response

Check import status

cURL
API Reference: Get import status

Response (Processing)

Response (Completed)

Per-row parse/normalization errors are not embedded in the job. When completedWithErrors is true (or the job FAILED), fetch the details from GET /v1/imports/contexts/{contextId}/jobs/{jobId}/errors (capped at 100 stored rows, with totalErrors/truncated accounting). For a wholesale FAILED job, diagnosis carries a safe one-line reason.

Import job status values

Validation and error handling


Matcher validates uploaded files at multiple stages.

Validation stages

1

Format Validation

Verifies the file is valid CSV, JSON, or XML with correct structure.
2

Schema Validation

Checks that required fields are present and match the configured field map.
3

Data Type Validation

Validates amounts are valid decimals, dates are parseable, currencies are valid ISO codes.

Common validation errors

Each row error carries the row number, the field when one applies, and a message. Common messages:

Handling errors

By default, Matcher imports valid rows even if some rows have errors. To fail the job when failed rows exceed a percentage, set fail_on_error_rate_percent (1 to 99) in the source config.

Duplicate detection


Matcher automatically detects and handles duplicate transactions to prevent double-counting.

How duplicates are detected

The source and external_id pair identifies a transaction. If a row repeats that pair (within the same upload or against already-persisted data), Matcher treats it as a duplicate.

Duplicate handling options

Set the duplicate_policy key in the source config to control handling: When duplicate_policy is absent, KEEP_FIRST applies.

Viewing duplicate details

The import summary shows the number of duplicates:

Batch uploads


For large reconciliation jobs, you can upload multiple files in sequence.

Upload multiple files

Wait for all imports

Before running matching, ensure all imports are complete:

Search uploaded transactions


After importing files, you can search across all transactions in a context to verify data quality or investigate specific records.
cURL

Response

API Reference: Search transactions
Supported filters include amount_min, amount_max, date_from, date_to, currency, source_id, status, exact external_id match via the reference parameter, and free-text search via the q parameter.

Best practices


Check file format and encoding locally before uploading. This catches obvious errors faster.
Standardize on ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ) across all sources to avoid parsing issues.
Always include unique transaction IDs from the source system. This enables proper duplicate detection and audit trails.
Decide on a convention (negative for debits, positive for credits) and apply it consistently. Document this in your field mapping.
For files larger than 50 MB, consider splitting them into smaller chunks by date range. This is a reliability recommendation, not the upload limit, and allows partial retries.
For recurring reconciliation, automate file uploads using scheduled jobs.

Next steps


Reviewing Matches

Learn how to interpret match results and confidence scores.

Field Mapping

Configure how source fields map to Matcher’s schema.