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:
| Scope | Allows |
|---|---|
reconciliations:read | List reconciliations, get results, the differences file and the report, email the report |
reconciliations:write | Create reconciliations from uploads or storage, run them |
templates:read | List and read templates |
templates:write | Create, 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 path | What it does |
|---|---|
POST /reconciliations/prepare | Upload 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-storage | Create a reconciliation from s3://bucket/key links, with the same optional template_id. The buckets must be allowed by the administrator. |
POST /reconciliations/{id}/run | Run 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 /reconciliations | Your reconciliations, newest first; page, limit, status. |
GET /reconciliations/{id}/diff | The differences file (CSV). |
GET /reconciliations/{id}/report | The PDF report. |
POST /reconciliations/{id}/report/send | Email the PDF report to up to 10 recipients. |
GET|POST|PUT|DELETE /templates | Manage 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.comOr 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" }
]
}'is_join_key: true. The
conditions are EQ, GT, GTE,
LT, LTE and IGNORE — see
comparison conditions.
Errors
| Code | Meaning |
|---|---|
401 | No API key, or the key is invalid or expired. |
403 | The key doesn't have the required scope. |
404 | The reconciliation or template doesn't exist or belongs to another user. |
422 | Validation failed: wrong file type, file too large, invalid link or bucket not allowed, no key column. |
429 | The 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