Match status lifecycle
Matches progress through a defined lifecycle:
- When the matching engine finds a pair of transactions that belong together, it creates a match in
PROPOSEDstatus. - Eligible engine-created matches (score 90 or above) from EXACT and TOLERANCE rules are auto-confirmed immediately. Manual matches start in
CONFIRMEDstatus. FUZZY and DATE_LAG matches remainPROPOSEDand are never auto-confirmed. - Matches that are not auto-confirmed remain in
PROPOSED. The public match-group API does not expose manual confirmation, but you can reject a proposed group with the unmatch operation and a required reason. - Rejecting a
PROPOSEDgroup returns its transactions to the unmatched pool. You can revoke aCONFIRMEDgroup only when Matcher can also reverse every residual/open-item effect that confirmation applied. On success, those changes and the transaction return happen atomically.
FUZZY and DATE_LAG matches are never auto-confirmed. Auto-confirmation at score ≥ 90 applies to eligible engine-created EXACT and TOLERANCE matches. A manual match starts in
CONFIRMED status. A match produced by a FUZZY or DATE_LAG rule stays in PROPOSED, regardless of its score, even a FUZZY match scoring 90+. You can reject it through the unmatch operation. There is no public manual-confirm operation. See Confidence scoring.Status lifecycle of a match.
Status definitions
Confidence tiers
Matcher assigns a confidence score (0-100) to each proposed match. The score determines what happens to the match.
Confidence levels
Understanding the score
Matcher calculates the confidence score from weighted components:
Example Score Breakdown:
Understanding variances
When matches have differences, review the variance details:
Amount variance
Common causes of amount variance:- Bank fees
- Currency conversion differences
- Rounding differences
- Partial payments
Date variance
Common causes of date variance:- Settlement timing
- Time zone differences
- Posting vs. transaction date
- Weekend/holiday processing
Match candidates, open items, and adjustments
Matcher gives you three surfaces for working a review queue: match candidates, open items, and adjustments.
List match candidates
Retrieve the ranked candidate proposals the engine considered for a transaction, the “why” behind a proposed match, including the per-component contributions.cURL
GET /v1/matching/candidates accepts contextId, transactionId, and limit query parameters and returns a CandidateProposalsResponse. The limit defaults to 50 and accepts values from 1 to 200.
The candidate picker scans at most 5,000 unmatched transactions from the opposite side and returns only 1:1 candidates. It applies the shared scorer to raw transaction data, without the run-time fee normalization or FX variance-band matching used by a matching run.
List open items
Open items are residual balances that remain when a transaction nets only in part. Track them to surface amounts that still need clearing or that have aged past their threshold.cURL
GET /v1/matching/contexts/{contextId}/open-items supports a status filter, plus limit/cursor pagination.
Open item statuses
The normal lifecycle flows
OPEN → PARTIALLY_CLEARED → CLEARED, with any still-open item able to become AGED once it passes the aging threshold. A successful confirmed-group unmatch withdraws that group’s residual effects. If no live contribution remains behind the obligation, the item ends WITHDRAWN. That status means the unmatch took the item back. It does not mean the item cleared or aged.
Create an adjustment
Post an accounting adjustment to account for a variance (bank fee, FX difference, rounding, write-off, and so on) against a match group or transaction.cURL
POST /v1/matching/adjustments requires the contextId query parameter. Body fields:
String
required
Adjustment amount
String
required
Non-empty currency string. Matcher does not validate ISO 4217 membership for this adjustment.
String
required
DEBIT or CREDITString
required
BANK_FEE, FX_DIFFERENCE, ROUNDING, WRITE_OFF, or MISCELLANEOUSString
required
Business reason for the adjustment
String
required
Human-readable description
UUID
Match group the adjustment applies to
UUID
Transaction the adjustment applies to
matchGroupId or transactionId.
Rejecting or revoking match groups
Use the unmatch operation to reject a
PROPOSED group or revoke a CONFIRMED group. After a successful operation, Matcher returns the group’s transactions to UNMATCHED. The next run can match them again.
Use DELETE /v1/matching/groups/{matchGroupId} with the required contextId query parameter and a reason in the request body (operationId unmatch):
cURL
reason field is mandatory and must not be empty. For a CONFIRMED group, Matcher verifies the residual/open-item reversal before it changes the group or its transactions. A successful operation atomically appends the compensating ledger entries, revokes the group, and returns its transactions to UNMATCHED.
When to reject or revoke
Common scenarios for rejecting or revoking a group:- Incorrect match confirmed: the transactions in a confirmed group belong to different records
- New information: Additional data shows the match is wrong
- Source correction: The source system issued a correction or reversal
- Duplicate transaction: one of the transactions is a duplicate that you should remove
What happens after unmatch
When you unmatch a match group:- Confirmed residuals come first: Matcher verifies that it can reverse every residual/open-item effect of a
CONFIRMEDgroup. If a later entry or a conflicting newer obligation blocks it, the operation returns409 Conflictand leaves the group, transactions, and open items unchanged. - Match status changes: A
CONFIRMEDgroup becomesREVOKED. A still-PROPOSEDgroup becomesREJECTED. - Transactions returned: On success, all associated transactions revert to
UNMATCHEDstatus. - Open-item effects reversed: On a confirmed-group unmatch, compensating ledger entries take back the group’s residual effects in the same transaction. If that leaves no live contribution behind an obligation, it becomes terminal
WITHDRAWNand does not carry forward. - Reason recorded: The group stores the supplied rejection or revocation reason.
- Streaming event emitted: A
match_group.unmatchedevent is emitted only when the group was previouslyCONFIRMED. - Re-matching possible: after a successful unmatch, the next run can match the transactions again.
Best practices
Start with lowest confidence matches
Start with lowest confidence matches
Review matches with the lowest confidence scores first. These matches are the most likely to be wrong. Give them the most attention.
Understand fixed confidence thresholds
Understand fixed confidence thresholds
The confidence thresholds do not change. Eligible engine-created EXACT and TOLERANCE matches with scores of 90 or above are auto-confirmed. Manual matches start
CONFIRMED. Scores between 60 and 89 remain PROPOSED, and scores below 60 become exceptions. These values are not configurable per context.FUZZY and DATE_LAG matches are the exception: they are never auto-confirmed and remain PROPOSED, regardless of score.Use rule tuning (priority, tolerance values) to influence how many matches land in each tier.Give a clear reason
Give a clear reason
Provide a specific reason when rejecting a proposed group or revoking a confirmed group. The unmatch operation requires it and stores it with the group.
Reject only after checking the source data
Reject only after checking the source data
Review the group and its source transactions before using the unmatch operation. Matcher exposes this operation per group. It does not expose bulk confirmation.
Review high-value matches carefully
Review high-value matches carefully
Regardless of confidence score, give extra attention to high-value matches. The impact of an incorrect match is proportional to the amount.
Next steps
Resolving exceptions
Handle transactions with no automatic match.
Confidence scoring
Deep dive into how Matcher calculates confidence scores.

