Skip to main content
Get Matcher running in minutes. This guide walks you through the complete journey, from creating your first reconciliation context to reviewing matched transactions.

Before you begin


You need:
  • A running Matcher instance
  • A valid JWT token for authentication
  • Two transaction files to reconcile (CSV, JSON, or XML)
All examples use cURL. Replace $TOKEN with your JWT token and https://api.matcher.example.com with your Matcher URL.

Step 1: Create a reconciliation context


A context defines the scope of your reconciliation: what you are comparing and how.
API reference: Create context
cURL
curl -X POST "https://api.matcher.example.com/v1/config/contexts" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "Daily Bank Reconciliation",
   "type": "1:1",
   "interval": "daily"
 }'
The type field defines how transactions are paired:
TypeDescription
1:1Each transaction matches exactly one counterpart
1:NOne transaction can match multiple counterparts
N:MMultiple transactions can match across both sides
Save the id from the response. You will use it in every subsequent step.
{
  "id": "019c96a0-2a10-7dfe-b5c1-8a1b2c3d4e5f",
  "name": "Daily Bank Reconciliation",
  "type": "1:1",
  "interval": "daily",
  "status": "DRAFT",
  "createdAt": "2026-03-04T12:00:00Z",
  "updatedAt": "2026-03-04T12:00:00Z"
}
The context starts in DRAFT status. It moves to ACTIVE when you are ready to run reconciliation.

Step 2: Add data sources


Every context needs at least two sources: the systems whose transactions you want to compare.
API reference: Create source

Create a bank source

cURL
curl -X POST "https://api.matcher.example.com/v1/config/contexts/{contextId}/sources" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "Chase Bank - Account 1234",
   "type": "BANK"
 }'

Create a ledger source

cURL
curl -X POST "https://api.matcher.example.com/v1/config/contexts/{contextId}/sources" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "General Ledger - GL 1000",
   "type": "LEDGER"
 }'
Save both source id values.

Source types

TypeUse case
BANKBank statements
LEDGERGeneral ledger / ERP exports
GATEWAYPayment processor data
CUSTOMAny other data source

Step 3: Map source fields


Your source files probably use different column names than Matcher expects. Field maps translate them into Matcher’s standard schema.
API reference: Create field map

Map the bank source

cURL
curl -X POST "https://api.matcher.example.com/v1/config/contexts/{contextId}/sources/{bankSourceId}/field-maps" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "mapping": {
     "Transaction ID": "transaction_id",
     "Amount": "amount",
     "Currency": "currency",
     "Post Date": "date",
     "Description": "reference"
   }
 }'

Map the ledger source

cURL
curl -X POST "https://api.matcher.example.com/v1/config/contexts/{contextId}/sources/{ledgerSourceId}/field-maps" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "mapping": {
     "entry_id": "transaction_id",
     "debit_credit_amount": "amount",
     "currency_code": "currency",
     "posting_date": "date",
     "memo": "reference"
   }
 }'

Required fields

Every transaction must have these fields after mapping:
FieldTypeDescription
transaction_idStringUnique identifier within the source
amountDecimalTransaction amount
currencyStringISO 4217 currency code (e.g. USD)
dateDateTransaction date (YYYY-MM-DD)
Optional but recommended: reference (external reference or description).

Step 4: Create match rules


Rules define how Matcher compares transactions. Start with an exact rule, which is the most precise.
API reference: Create match rule

Create an exact rule

cURL
curl -X POST "https://api.matcher.example.com/v1/config/contexts/{contextId}/rules" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "type": "EXACT",
   "priority": 1,
   "config": {
     "matchAmount": true,
     "matchCurrency": true,
     "matchDate": true,
     "matchReference": true,
     "caseInsensitive": true,
     "datePrecision": "DAY"
   }
 }'

Add a tolerance rule as fallback

Catch small differences like bank fees or rounding:
cURL
curl -X POST "https://api.matcher.example.com/v1/config/contexts/{contextId}/rules" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "type": "TOLERANCE",
   "priority": 10,
   "config": {
     "percentTolerance": 0.01,
     "absTolerance": 5.0,
     "dateWindowDays": 2,
     "matchCurrency": true,
     "matchReference": true,
     "caseInsensitive": true
   }
 }'
Matcher evaluates rules by priority (lowest number first). The exact rule runs first. Only unmatched transactions fall through to the tolerance rule.

Rule types

TypeWhen to usePriority range
EXACTValues should match exactly1-10
TOLERANCESmall, expected differences11-50
DATE_LAGDate delays between systems51-100

Step 5: Activate the context


Move the context from DRAFT to ACTIVE:
API reference: Update context
cURL
curl -X PATCH "https://api.matcher.example.com/v1/config/contexts/{contextId}" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "status": "ACTIVE"
 }'

Step 6: Upload transaction files


Upload one file per source. Matcher accepts CSV, JSON, and XML formats via multipart form upload.

Upload bank transactions

cURL
curl -X POST "https://api.matcher.example.com/v1/imports/contexts/{contextId}/sources/{bankSourceId}/upload" \
 -H "Authorization: Bearer $TOKEN" \
 -F "file=@bank_transactions.csv" \
 -F "format=csv"

Upload ledger transactions

cURL
curl -X POST "https://api.matcher.example.com/v1/imports/contexts/{contextId}/sources/{ledgerSourceId}/upload" \
 -H "Authorization: Bearer $TOKEN" \
 -F "file=@ledger_entries.csv" \
 -F "format=csv"
Each upload creates an ingestion job. Check the job status:
cURL
curl -X GET "https://api.matcher.example.com/v1/imports/contexts/{contextId}/jobs" \
 -H "Authorization: Bearer $TOKEN"
Wait for both jobs to reach COMPLETED status before running the match.

Step 7: Run matching


Start with a dry run to preview results without persisting:
API reference: Run match
cURL
curl -X POST "https://api.matcher.example.com/v1/matching/contexts/{contextId}/run" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "mode": "DRY_RUN"
 }'
Both responses include a runId. Save it for Step 8. Review the dry run results. When satisfied, run with COMMIT to persist matches:
cURL
curl -X POST "https://api.matcher.example.com/v1/matching/contexts/{contextId}/run" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "mode": "COMMIT"
 }'

Step 8: Review results


View match groups

cURL
curl -X GET "https://api.matcher.example.com/v1/matching/runs/{runId}/groups?contextId={contextId}" \
 -H "Authorization: Bearer $TOKEN"
Each match group contains paired transactions and a confidence score (0-100):
ScoreWhat happens
90-100Auto-confirmed, no action needed
60-89Needs manual review
Below 60No match created, becomes an exception

Undo an incorrect match

Use the unmatch endpoint to reject a match group and return transactions to the unmatched pool:
cURL
curl -X DELETE "https://api.matcher.example.com/v1/matching/groups/{matchGroupId}?contextId={contextId}" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "reason": "Transactions belong to different records"
 }'
Rejected transactions return to the unmatched pool for the next run.

Step 9: Handle exceptions


Exceptions are transactions that could not be matched automatically. Matcher classifies each exception by severity:
API reference: List exceptions
SeverityCriteriaSLA
CRITICALAmount >= 100,000 or age >= 120h24 hours
HIGHAmount >= 10,000 or age >= 72h72 hours
MEDIUMAmount >= 1,000 or age >= 24h5 days
LOWAll others7 days

List exceptions

cURL
curl -X GET "https://api.matcher.example.com/v1/exceptions" \
 -H "Authorization: Bearer $TOKEN"
Resolve exceptions by force matching, creating adjustments, or dispatching to external systems like JIRA.

Next steps