Recon
Generic reconciliation for any two data sources: CSV, XLSX, or live HTTP APIs.
Pair any two data sources, run reconciliation over a date window, and bucket every row as matched, mismatched, or missing. Vendor-neutral, config-driven, and persisted to your own database.
Every joined row lands in exactly one bucket
Recon hash-joins both sources on your chosen key and decides where each row belongs. No row is silently dropped, no row is double-counted.
Matched
Both sides agree on amount and status within tolerance.
Amount mismatch
Join key matches, but the amounts differ beyond your tolerance.
Status mismatch
Amounts agree, but the reported statuses disagree after equivalence.
Missing in Source A
Only Source B has the row. Source A is silent.
Missing in Source B
Only Source A has the row. Source B never reported it.
What Recon does
CSV, XLSX, or live API sources
Define each feed once with a name, type, and column mappings. File sources accept per-run CSV or XLSX uploads; live API sources are fetched for you, with the run's date window slotted into the request automatically.
Column mappings, not vendor code
Tell Recon which columns are the join key, amount, status, and timestamp, across any number of header variants (case, underscores, whitespace are normalised). The same engine handles every PSP, gateway, or ledger without forking.
Comparisons with match rules
Pair two sources, set an absolute amount tolerance, choose case-sensitive or case-insensitive joining, and optionally provide a JSON status equivalence map (e.g. SUCCESS / ISSUANCE_SUCCESS / COMPLETED) for cross-vendor state alignment.
Bucketed runs with hash join
Each run normalises both sides, hash-joins on the join key, and buckets every row as Matched, Amount mismatch, Status mismatch, Missing in Source A, or Missing in Source B, with totals, amounts, and full row snapshots persisted to your own database.
Handles large, paged APIs securely
Live API sources page through large result sets automatically, with safety caps so a run can never loop forever. Access tokens and other secrets are encrypted at rest and never shown back in plain text.
Date-window scoping
Every run carries a start and end date. Rows whose timestamp falls outside the window are dropped before matching; sources without a timestamp column include every row regardless. Quick presets cover today, yesterday, and the last 14 days.
Inspect every row
Drill into any run, filter by bucket, and see the full left + right row snapshot side by side, including the join key, mapped fields, and the extra columns you flagged. No exports needed to investigate a single mismatch.
Your data, your retention
Sources, comparisons, runs, and row snapshots live in your own database. Recon never holds a copy of your transactional data, only the configuration that tells the engine how to reconcile it.
Drive Recon from your AI agent
Recon is exposed through the Juniors AI MCP server, so Cursor, Claude, and any other MCP client can work with it directly. Grant a key the recon:read scope for the read tools, or recon:write to include the writes.
recon:readrecon_list_sourcesEvery configured source, both file uploads and live API feeds.
recon_list_comparisonsEvery paired comparison and the match rules it applies.
recon_list_runsRun history with bucket totals for each run.
recon_get_runOne run's bucket counts and amounts across all five buckets.
recon_get_run_rowsDrill into individual rows in any bucket, with both row snapshots side by side.
recon:writerecon_trigger_runKick off a reconciliation over a date window. Both sides must be live API sources.
Try asking your agent
“Reconcile yesterday's settlement comparison, then list every row that landed in the amount-mismatch bucket.”
33 tools across all six products, plus a public OpenAPI spec at /api/openapi.json if you would rather call the REST API directly.
Recon - common questions
Ready to run Recon on your infrastructure?
Get early access to the full Juniors AI workspace.
Get Access