Skip to main content
Matcher includes reporting tools to document reconciliation outcomes, monitor exceptions, and preserve audit evidence for compliance.

Available reports


  • Reconciliation summary: A high-level snapshot of match rates, exception volume, and total variances.
  • Match detail report: A complete list of matches, including transaction details, confidence scores, and variance breakdowns.
  • Exception repor: A focused view of unresolved exceptions with aging, severity, and resolution status.
  • Audit trail report: A chronological record of reconciliation activity for investigation and compliance.

Reconciliation summary report


The summary report gives you a top-level view of reconciliation performance for a selected period.

Generate a summary report

cURL
curl -X POST "https://api.matcher.example.com/v1/reports/summary" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "date_from": "2024-01-01",
   "date_to": "2024-01-31",
   "format": "json"
 }'

Response

{
  "report_id": "rpt_sum_001",
  "report_type": "RECONCILIATION_SUMMARY",
  "context_id": "ctx_abc123",
  "period": {
    "from": "2024-01-01",
    "to": "2024-01-31"
  },
  "generated_at": "2024-02-01T08:00:00Z",
  "summary": {
    "transactions": {
      "total": 5000,
      "matched": 4750,
      "unmatched": 250,
      "match_rate": 95.0
    },
    "matches": {
      "total": 2375,
      "auto_confirmed": 2100,
      "manually_confirmed": 200,
      "rejected": 75
    },
    "exceptions": {
      "total": 250,
      "resolved": 180,
      "open": 70,
      "by_severity": {
        "critical": 5,
        "high": 15,
        "medium": 25,
        "low": 25
      }
    },
    "variance": {
      "total_amount": 12500.0,
      "currency": "USD",
      "by_type": {
        "bank_fee": 3500.0,
        "fx_variance": 5000.0,
        "timing": 2500.0,
        "other": 1500.0
      }
    },
    "sources": [
      {
        "source_id": "src_bank456",
        "source_name": "Chase Bank",
        "transactions": 2500,
        "matched": 2400,
        "match_rate": 96.0
      },
      {
        "source_id": "src_ledger789",
        "source_name": "Main Ledger",
        "transactions": 2500,
        "matched": 2350,
        "match_rate": 94.0
      }
    ]
  }
}

What the report includes

SectionContents
Transaction summaryTotals and match rate (overall and by source)
Match summaryAuto vs manual confirmations, plus rejections
Exception summaryOpen/resolved counts and severity breakdown
Variance summaryTotal variance by type and amount
Source breakdownPer-source reconciliation metrics

Match detail report


The match detail report lists every match with full transaction metadata and variance fields.

Generate a match detail report

cURL
curl -X POST "https://api.matcher.example.com/v1/reports/matches" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "date_from": "2024-01-01",
   "date_to": "2024-01-31",
   "status": [
     "CONFIRMED"
   ],
   "include_transactions": true,
   "format": "csv"
 }'

Response

{
  "report_id": "rpt_mtch_001",
  "report_type": "MATCH_DETAIL",
  "status": "GENERATING",
  "estimated_rows": 2375,
  "download_url": null,
  "expires_at": null
}

Check report status

cURL
curl -X GET "https://api.matcher.example.com/v1/reports/rpt_mtch_001" \
 -H "Authorization: Bearer $TOKEN"

Response (ready)

{
  "report_id": "rpt_mtch_001",
  "report_type": "MATCH_DETAIL",
  "status": "READY",
  "row_count": 2375,
  "file_size_bytes": 524288,
  "format": "csv",
  "download_url": "https://api.matcher.example.com/v1/reports/rpt_mtch_001/download",
  "expires_at": "2024-02-02T08:00:00Z"
}

CSV output format

match_id,status,confidence,rule_name,created_at,confirmed_at,txn1_id,txn1_source,txn1_amount,txn1_date,txn2_id,txn2_source,txn2_amount,txn2_date,amount_variance,date_variance_days
match_001,CONFIRMED,100,Exact Match,2024-01-15T10:00:00Z,2024-01-15T10:00:01Z,txn_bank_001,Chase Bank,1000.00,2024-01-15,txn_led_001,Main Ledger,1000.00,2024-01-15,0.00,0
match_002,CONFIRMED,85,Amount Tolerance,2024-01-16T10:00:00Z,2024-01-16T14:30:00Z,txn_bank_002,Chase Bank,5000.00,2024-01-16,txn_led_002,Main Ledger,5012.50,2024-01-16,12.50,0

Exception report


Use the exception report to investigate open items, track aging, and prioritize remediation.

Generate an exception report

cURL
curl -X POST "https://api.matcher.example.com/v1/reports/exceptions" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "date_from": "2024-01-01",
   "date_to": "2024-01-31",
   "status": [
     "OPEN",
     "IN_REVIEW"
   ],
   "severity": [
     "CRITICAL",
     "HIGH"
   ],
   "format": "json"
 }'

Response

{
  "report_id": "rpt_exc_001",
  "report_type": "EXCEPTION_DETAIL",
  "context_id": "ctx_abc123",
  "period": {
    "from": "2024-01-01",
    "to": "2024-01-31"
  },
  "filters": {
    "status": [
      "OPEN",
      "IN_REVIEW"
    ],
    "severity": [
      "CRITICAL",
      "HIGH"
    ]
  },
  "generated_at": "2024-02-01T08:00:00Z",
  "summary": {
    "total": 20,
    "total_amount": 250000.0,
    "currency": "USD",
    "by_status": {
      "OPEN": 12,
      "IN_REVIEW": 8
    },
    "by_severity": {
      "CRITICAL": 5,
      "HIGH": 15
    },
    "average_age_days": 3.5
  },
  "exceptions": [
    {
      "id": "exc_001",
      "status": "OPEN",
      "severity": "CRITICAL",
      "age_days": 5,
      "sla_status": "OVERDUE",
      "transaction": {
        "id": "txn_bank_999",
        "source_name": "Chase Bank",
        "amount": 75000.0,
        "currency": "USD",
        "date": "2024-01-15",
        "reference": "Wire #12345"
      },
      "reason": "NO_MATCH_FOUND",
      "assigned_to": "user_123",
      "created_at": "2024-01-20T10:00:00Z"
    }
  ]
}

Exception aging analysis

Exception reports include aging buckets for SLA tracking:
{
  "aging": {
    "current": 25,
    "1_to_3_days": 15,
    "3_to_5_days": 8,
    "over_5_days": 2,
    "overdue_sla": 5
  }
}

Audit trail report


The audit trail report provides an immutable, time-ordered history of reconciliation activity.

Generate an audit trail report

cURL
curl -X POST "https://api.matcher.example.com/v1/reports/audit" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "date_from": "2024-01-01",
   "date_to": "2024-01-31",
   "action_types": [
     "MATCH_CONFIRMED",
     "MATCH_REJECTED",
     "EXCEPTION_RESOLVED"
   ],
   "format": "json"
 }'

Response

{
  "report_id": "rpt_aud_001",
  "report_type": "AUDIT_TRAIL",
  "context_id": "ctx_abc123",
  "period": {
    "from": "2024-01-01",
    "to": "2024-01-31"
  },
  "generated_at": "2024-02-01T08:00:00Z",
  "event_count": 1250,
  "events": [
    {
      "timestamp": "2024-01-15T10:30:00Z",
      "action": "MATCH_CONFIRMED",
      "user": "system",
      "entity_type": "match",
      "entity_id": "match_001",
      "details": {
        "confidence": 100,
        "rule": "Exact Match",
        "auto_approved": true
      }
    },
    {
      "timestamp": "2024-01-16T14:30:00Z",
      "action": "MATCH_CONFIRMED",
      "user": "user_123",
      "entity_type": "match",
      "entity_id": "match_002",
      "details": {
        "confidence": 75,
        "notes": "Verified variance is bank fee"
      }
    },
    {
      "timestamp": "2024-01-17T09:15:00Z",
      "action": "EXCEPTION_RESOLVED",
      "user": "user_456",
      "entity_type": "exception",
      "entity_id": "exc_001",
      "details": {
        "resolution_type": "FORCE_MATCH",
        "target_transaction": "txn_led_777",
        "notes": "Amount difference due to wire fee"
      }
    }
  ]
}

Audit action types

ActionDescription
TRANSACTION_IMPORTEDTransaction added through ingestion
MATCH_CREATEDSystem proposed a match
MATCH_CONFIRMEDMatch approved (automatic or manual)
MATCH_REJECTEDMatch declined
EXCEPTION_CREATEDException generated
EXCEPTION_ASSIGNEDException assigned to a user or group
EXCEPTION_ESCALATEDException escalated based on rules or SLA
EXCEPTION_RESOLVEDException resolved with a recorded method
ADJUSTMENT_CREATEDAdjusting entry created to document variance
CONTEXT_CLOSEDReconciliation period closed

Export formats


Choose a report format based on how you plan to consume the output.

JSON

  • Best for: API integrations and programmatic processing.
  • Response: Returns a structured JSON response.

Code example

curl -X POST "https://api.matcher.example.com/v1/reports/summary" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "format": "json"
 }'

CSV

  • Best for: Spreadsheet analysis and downstream imports.
  • Response: Returns a download URL for the generated file.

Code example

curl -X POST "https://api.matcher.example.com/v1/reports/matches" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "format": "csv"
 }'

PDF

  • Best for: Formal documentation, printing, and sharing.
  • Response: Returns a download URL for the formatted PDF.

Code example

curl -X POST "https://api.matcher.example.com/v1/reports/summary" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "format": "pdf",
   "pdf_options": {
     "include_logo": true,
     "include_signatures": true,
     "page_size": "letter"
   }
 }'

Excel

  • Best for: Multi-sheet analysis and team workflows.
  • Response: Returns a download URL for the Excel workbook.

Code example

curl -X POST "https://api.matcher.example.com/v1/reports/summary" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "format": "xlsx",
   "xlsx_options": {
     "include_charts": true,
     "include_pivot_tables": true
   }
 }'

Downloading reports


Large outputs are generated asynchronously. Request the report, poll status, then download.

Download flow

1

Request report

Submit a generation request with the parameters you need.
2

Poll status

Check status until status becomes READY.
3

Download

Use download_url to retrieve the file.

Report status values

StatusDescription
QUEUEDRequest accepted and waiting to start
GENERATINGReport is being generated
READYReport is ready to download
EXPIREDDownload link expired (regenerate the report)
FAILEDReport generation failed

Scheduling reports


Automate report generation and delivery for recurring reconciliations.

Create a scheduled report

cURL
curl -X POST "https://api.matcher.example.com/v1/report-schedules" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "Daily Reconciliation Summary",
   "report_type": "RECONCILIATION_SUMMARY",
   "context_id": "ctx_abc123",
   "schedule": {
     "frequency": "daily",
     "time": "08:00",
     "timezone": "America/New_York"
   },
   "format": "pdf",
   "delivery": {
     "method": "email",
     "recipients": [
       "[email protected]",
       "[email protected]"
     ]
   }
 }'

Response

{
  "schedule_id": "sch_001",
  "name": "Daily Reconciliation Summary",
  "report_type": "RECONCILIATION_SUMMARY",
  "context_id": "ctx_abc123",
  "schedule": {
    "frequency": "daily",
    "time": "08:00",
    "timezone": "America/New_York",
    "next_run": "2024-02-02T08:00:00-05:00"
  },
  "format": "pdf",
  "delivery": {
    "method": "email",
    "recipients": [
      "[email protected]",
      "[email protected]"
    ]
  },
  "status": "ACTIVE",
  "created_at": "2024-02-01T10:00:00Z"
}

Schedule frequencies

FrequencyDescriptionConfiguration
dailyEvery day at a fixed time"time": "08:00"
weeklyOn selected weekday(s)"days": ["monday", "friday"]
monthlyOn a day of the month"day_of_month": 1 or "day_of_month": "last"
on_closeWhen the context is closedNo additional config

Delivery methods

MethodConfiguration
email"recipients": ["[email protected]"]
webhook"webhook_url": "https://..."
sftp"sftp_config_id": "sftp_001"
s3"s3_bucket": "bucket-name", "s3_prefix": "reports/"

S3 export


Export reports directly to Amazon S3 for long-term storage, compliance archival, or integration with data pipelines.

Configure S3 credentials

Before exporting to S3, configure your AWS credentials:
cURL
curl -X POST "https://api.matcher.example.com/v1/admin/integrations/s3" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "Production S3 Archive",
   "region": "us-east-1",
   "credentials": {
     "access_key_id": "AKIAIOSFODNN7EXAMPLE",
     "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
   },
   "default_bucket": "company-reconciliation-archive",
   "default_prefix": "matcher/reports/"
 }'

Response

{
  "id": "s3_config_001",
  "name": "Production S3 Archive",
  "region": "us-east-1",
  "default_bucket": "company-reconciliation-archive",
  "default_prefix": "matcher/reports/",
  "status": "ACTIVE",
  "test_connection": "SUCCESSFUL",
  "created_at": "2024-01-15T10:00:00Z"
}
Use IAM roles instead of access keys when running Matcher on AWS (EC2, ECS, EKS). The system will automatically use the instance role if credentials are not provided.

Export to S3 (one-time)

Export a specific report to S3:
cURL
curl -X POST "https://api.matcher.example.com/v1/reports/rpt_sum_001/export/s3" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "s3_config_id": "s3_config_001",
   "bucket": "company-reconciliation-archive",
   "key": "matcher/reports/2024/01/summary_2024-01-31.pdf",
   "storage_class": "STANDARD_IA",
   "server_side_encryption": "AES256",
   "metadata": {
     "context_name": "Daily Bank Reconciliation",
     "period": "2024-01",
     "report_type": "summary"
   }
 }'

Response

{
  "export_id": "exp_s3_001",
  "status": "IN_PROGRESS",
  "s3_location": {
    "bucket": "company-reconciliation-archive",
    "key": "matcher/reports/2024/01/summary_2024-01-31.pdf",
    "region": "us-east-1"
  },
  "started_at": "2024-02-01T08:00:00Z"
}

Check export status

curl -X GET "https://api.matcher.example.com/v1/exports/exp_s3_001" \
 -H "Authorization: Bearer $TOKEN"

Response (completed)

{
  "export_id": "exp_s3_001",
  "status": "COMPLETED",
  "s3_location": {
    "bucket": "company-reconciliation-archive",
    "key": "matcher/reports/2024/01/summary_2024-01-31.pdf",
    "region": "us-east-1",
    "url": "s3://company-reconciliation-archive/matcher/reports/2024/01/summary_2024-01-31.pdf",
    "version_id": "3/L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo"
  },
  "file_size_bytes": 524288,
  "etag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
  "completed_at": "2024-02-01T08:00:15Z",
  "duration_seconds": 15
}

Automatic S3 export with scheduled reports

Configure reports to automatically export to S3:
cURL
curl -X POST "https://api.matcher.example.com/v1/report-schedules" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "name": "Daily Summary - S3 Archive",
   "report_type": "RECONCILIATION_SUMMARY",
   "context_id": "ctx_abc123",
   "schedule": {
     "frequency": "daily",
     "time": "08:00",
     "timezone": "UTC"
   },
   "format": "pdf",
   "delivery": {
     "method": "s3",
     "s3_config_id": "s3_config_001",
     "s3_bucket": "company-reconciliation-archive",
     "s3_key_pattern": "matcher/reports/{context_name}/{year}/{month}/summary_{date}.pdf",
     "storage_class": "GLACIER_IR",
     "server_side_encryption": "aws:kms",
     "kms_key_id": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
   }
 }'

S3 key patterns

Use dynamic patterns to organize exports:
Pattern VariableDescriptionExample
{context_id}Context IDctx_abc123
{context_name}Context name (slugified)daily-bank-reconciliation
{report_type}Report typesummary
{year}4-digit year2024
{month}2-digit month01
{day}2-digit day31
{date}ISO date2024-01-31
{timestamp}ISO timestamp2024-01-31T08-00-00Z
{format}File formatpdf
Example patterns:
  • reports/{year}/{month}/{day}/{context_name}_{report_type}.{format}
  • {context_id}/monthly/{year}-{month}.pdf
  • archive/{date}/{report_type}_{timestamp}.csv

S3 storage classes

Choose the appropriate storage class based on access patterns:
Storage ClassUse CaseRetrieval TimeCost
STANDARDFrequent accessImmediateHighest
STANDARD_IAInfrequent access (30+ day retention)ImmediateMedium
GLACIER_IRArchive, occasional accessMillisecondsLow
GLACIERLong-term archiveHoursLowest
DEEP_ARCHIVECompliance archive (7+ years)12 hoursLowest
Storage classes like GLACIER and DEEP_ARCHIVE have minimum storage duration charges. Ensure reports will be retained for the minimum period before using these classes.

Encryption options

Encryption TypeConfigurationUse Case
AES256Server-side encryption with Amazon S3-managed keysDefault, simple setup
aws:kmsAWS KMS-managed encryption keysAudit trail, key rotation
aws:kms:dsseDouble encryption with KMSHigh-security compliance requirements

S3 lifecycle policies

Configure lifecycle rules in your S3 bucket to automate archival:
S3 Lifecycle Rule Example
{
  "Rules": [
    {
      "Id": "ArchiveMatcherReports",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "matcher/reports/"
      },
      "Transitions": [
        {
          "Days": 90,
          "StorageClass": "STANDARD_IA"
        },
        {
          "Days": 365,
          "StorageClass": "GLACIER_IR"
        },
        {
          "Days": 2555,
          "StorageClass": "DEEP_ARCHIVE"
        }
      ],
      "Expiration": {
        "Days": 2920
      }
    }
  ]
}
Recommended lifecycle:
  • 0-90 days: STANDARD (active reconciliation period)
  • 90-365 days: STANDARD_IA (recent archive)
  • 1-7 years: GLACIER_IR or GLACIER (compliance retention)
  • 7+ years: DEEP_ARCHIVE (long-term regulatory)
  • After retention period: Auto-delete

Best practices

When running on AWS, use IAM instance roles instead of embedding access keys. This provides automatic credential rotation and better security.
Turn on S3 versioning for your archive bucket to protect against accidental deletions or overwrites.
Configure bucket policies to restrict access to authorized IAM roles only. Deny public access.
Financial services and regulated industries should use AWS KMS encryption to maintain audit trails of data access.
Use year/month/day folders to organize reports chronologically. This simplifies lifecycle management and retrieval.
Add metadata tags to S3 objects (context, period, type) for easier searching and cost allocation.

SOX compliance


Matcher maintains immutable audit trails that support SOX (Sarbanes–Oxley) requirements.

Compliance features

Every action is recorded with a timestamp, actor identity, and before/after state. Audit entries are append-only.
Actions are tied to a user or system principal. Service accounts remain distinguishable from human users.
Reports can show who executed an action versus who approved it, supporting SOD controls.
Audit data follows configurable retention policies (for example, 7 years for financial records).
Generate auditor-friendly packages with full action history and supporting context.

Compliance report

Generate an auditor-oriented report:
curl -X POST "https://api.matcher.example.com/v1/reports/compliance" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "context_id": "ctx_abc123",
   "date_from": "2024-01-01",
   "date_to": "2024-12-31",
   "format": "pdf",
   "include": [
     "reconciliation_summary",
     "exception_resolutions",
     "manual_overrides",
     "user_activity",
     "approval_chain"
   ]
 }'

Best practices


Automate a daily summary report delivered each morning to keep stakeholders aligned.
Store reports in secure, durable storage. Financial artifacts often require multi-year retention.
Generate targeted reports by date, status, severity, or source—avoid exporting everything by default.
Include source names, rule names, and key identifiers so the output can stand alone outside Matcher.
Large reports can fail or stall. Track job status and alert on FAILED or prolonged GENERATING.

Next steps