Reconcio

API

Everything you do in the UI is available through the REST API: upload or reference files, run reconciliations with templates, fetch results, the differences file and the PDF report.

Full reference

Every installation serves its own OpenAPI description with Swagger UI at/swagger/index.html — for examplehttps://reconcio.example.com/swagger/index.html. It always matches the version you run, so treat it as the source of truth for request and response fields. This page covers the essentials.

Authentication

The base path is /api/v1. Every request carries an API key in the Authorization header:

curl https://reconcio.example.com/api/v1/templates \
  -H "Authorization: Bearer $RECONCIO_API_KEY"

Keys are created in the UI under API keys (see theuser guide). A key works on behalf of the user who created it and only within its scopes:

ScopeAllows
reconciliations:readList reconciliations, get results, the differences file and the report, email the report
reconciliations:writeCreate reconciliations from uploads or storage, run them
templates:readList and read templates
templates:writeCreate, update and delete templates

A key can also have rate limits per minute and per day and an expiry date. A blocked user's keys stop working immediately.

Endpoints

Method and pathWhat it does
POST /reconciliations/prepareUpload file_a and file_b (multipart). Optional template_id starts the run automatically; optional report_emails (comma-separated) receive the PDF report when it completes.
POST /reconciliations/prepare-from-storageCreate a reconciliation from s3://bucket/key links, with the same optional template_id. The buckets must be allowed by the administrator.
POST /reconciliations/{id}/runRun with final_columns or a template_id — needed only when no template was given at creation.
GET /reconciliations/{id}Status, suggested and final columns, results.
GET /reconciliationsYour reconciliations, newest first; page, limit, status.
GET /reconciliations/{id}/diffThe differences file (CSV).
GET /reconciliations/{id}/reportThe PDF report.
POST /reconciliations/{id}/report/sendEmail the PDF report to up to 10 recipients.
GET|POST|PUT|DELETE /templatesManage templates.

Typical flow

With a template — one request

Upload both files with a template_id. The reconciliation runs as soon as the files are prepared, and the report is emailed when it completes:

curl -X POST https://reconcio.example.com/api/v1/reconciliations/prepare \
  -H "Authorization: Bearer $RECONCIO_API_KEY" \
  -F file_a=@psp_transactions.csv \
  -F file_b=@ledger.xlsx \
  -F template_id=3c1e7a52-0b9d-4c64-9f0e-2a7d5b8c4e11 \
  -F report_emails=finance@example.com

Or reference files that are already in your S3 storage:

curl -X POST https://reconcio.example.com/api/v1/reconciliations/prepare-from-storage \
  -H "Authorization: Bearer $RECONCIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "file_a": "s3://psp-exports/2026-10/transactions.csv",
    "file_b": "s3://erp-exports/2026-10/ledger.xlsx",
    "template_id": "3c1e7a52-0b9d-4c64-9f0e-2a7d5b8c4e11"
  }'

Get the result

The response to prepare contains the reconciliationid. Poll it until status iscompleted or failed:

curl https://reconcio.example.com/api/v1/reconciliations/8f2b9d51-f5a8-4b64-8a0d-4c8db2dc6e4f \
  -H "Authorization: Bearer $RECONCIO_API_KEY"

{
  "id": "8f2b9d51-f5a8-4b64-8a0d-4c8db2dc6e4f",
  "status": "completed",
  "file_a_rows_count": 10544,
  "file_b_rows_count": 10531,
  "results": {
    "matched_rows_count": 10487,
    "mismatched_rows_count": 29,
    "missed_rows_count_in_file_b": 26,
    "missed_rows_count_in_file_a": 15,
    "duplicate_key_rows_count": 2,
    "convergence": 0.9934,
    "float_column_stat": [
      {
        "column_name": "amount",
        "total_a": 1284903.17,
        "total_b": 1284903.16,
        "difference": 0.01
      }
    ],
    ...
  }
}

Then download the differences file and the report:

# Differences file (CSV)
curl -o diff.csv https://reconcio.example.com/api/v1/reconciliations/$ID/diff \
  -H "Authorization: Bearer $RECONCIO_API_KEY"

# PDF report
curl -o report.pdf https://reconcio.example.com/api/v1/reconciliations/$ID/report \
  -H "Authorization: Bearer $RECONCIO_API_KEY"

Without a template

Upload the files without template_id, wait for the statusawaiting_user_config, check suggested_columns and run with your choice of columns. Any column of file A or file B can be used, not only the suggested ones; their lists are in file_a_columnsand file_b_columns.

curl -X POST https://reconcio.example.com/api/v1/reconciliations/$ID/run \
  -H "Authorization: Bearer $RECONCIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "final_columns": [
      { "file_a_column": "transaction_id", "file_b_column": "payment_id", "is_join_key": true },
      { "file_a_column": "amount", "file_b_column": "Betrag", "condition": "EQ" },
      { "file_a_column": "status", "file_b_column": "Status", "condition": "IGNORE" }
    ]
  }'
At least one column must have is_join_key: true. The conditions are EQ, GT, GTE, LT, LTE and IGNORE — see comparison conditions.

Errors

CodeMeaning
401No API key, or the key is invalid or expired.
403The key doesn't have the required scope.
404The reconciliation or template doesn't exist or belongs to another user.
422Validation failed: wrong file type, file too large, invalid link or bucket not allowed, no key column.
429The key's rate limit is exceeded.

Error bodies follow the Problem Details format (application/problem+json); the exact fields are in Swagger UI.

Can't find an answer? Write to support@reconcio.pro