Upload any data file. Download it in any format.

Excel → CSV  ·  CSV → Parquet  ·  JSON → Excel  ·  or anything else

No file chosen

Privacy Policy

Effective Date: March 7, 2026

We never use your files or data in any way, except to process your request. Period.

File Storage

The files you submit are stored locally for the duration of your visit to the site, plus fifteen minutes. File contents are never retained, nor are they ever shared with any third party.

Logging

We log your email address, the types of conversions you did, incidental file metadata, and timestamp information for performance monitoring and abuse prevention purposes. Logs are retained for 90 days. Logs are never shared with any third party.

Free Use

No user information beyond originating IP address and file metadata is retained for users of the free service. No credit card or email information is required to use the free service.

Rate-Limiting

We reserve the right to rate-limit requests from IP address that appear to be abusing or attacking the service.

Subscriptions and Keys

All payments are processed by Stripe. We never see nor have access to your credit card information, Stripe simply informs us that your payment was valid.

Information Sharing

Absolutely none of your information ever leaves this site. No logs, no file metadata, no email addresses, no file contents. Your data resides on our servers for the duration of your visit plus fifteen minutes, and is deleted permanently.

Data Security

We protect user data with standard industry best-practices to prevent unauthorized information collection and disclosure.

Contact Information

There is a contact/feedback form on the Contacts page. We encourage you to reach out if you have questions, concerns, or suggestions. We read every message.

Security

We protect user data with standard industry best-practices to prevent unauthorized information collection and disclosure.

Security Policy

This page will always contain our current security information, with a date at the top for the last time it was updated.

Pricing

No account required to try. Convert up to 100 rows free. Register for more.

Free

$0

no account required

  • ✓ 100 rows per conversion
  • ✓ 10 conversions per day
  • ✓ 10 MB file size limit
  • ✓ CSV, TSV, Excel, JSON, JSONL, Parquet
  • ✓ Preview schema & encoding
  • ✗ Cleaner, Splitter
  • ✗ API / CLI / MCP
  • ✗ Fixed-Width / EBCDIC

Free · Verified

$0

register + verify email

  • 250 rows per conversion
  • 25 conversions per day
  • ✓ 10 MB file size limit
  • ✓ CSV, TSV, Excel, JSON, JSONL, Parquet
  • ✓ Preview schema & encoding
  • ✗ Cleaner, Splitter
  • ✗ API / CLI / MCP
  • ✗ Fixed-Width / EBCDIC

Standard

$29

per month · auto-renews

  • Unlimited rows per conversion
  • ✓ Unlimited conversions / day
  • 500 MB file size limit
  • ✓ All output formats
  • ✓ JSON Flattener (unlimited depth)
  • ✓ Data Cleaner
  • ✓ File Splitter
  • ✓ Cancel anytime
  • ✗ API / CLI / MCP
  • ✗ Fixed-Width / EBCDIC

Professional

$79

per month · auto-renews

  • Everything in Standard
  • 2 GB file size limit
  • ✓ REST API access
  • ✓ CLI tool (reparatio convert …)
  • ✓ Python & JS SDKs
  • ✓ MCP server for AI assistants
  • Fixed-Width Format parser
  • EBCDIC mainframe encoding
  • ✓ Cancel anytime

Conversion Credits — $10 for 25 conversions

Pay as you go. One credit converts one file, no expiry. Gets you Standard-tier features (unlimited rows, 500 MB, all formats). Credits stack — buy more anytime. No API, CLI, MCP, Fixed-Width, or EBCDIC access.

Subscriptions renew monthly. Cancel anytime — access continues through the paid period. All prices in USD.

Create a free account

Register with your email to unlock 250 rows and 25 conversions per day. We'll send a verification link — no password needed.

Already have an access key?

Lost your key? Resend it to your email.

Docs

Upload a file, preview it, transform it, and download it in any supported format. Files are processed in memory and never stored.

CLI (alpha)

Professional subscribers can also use Reparatio from the command line without writing raw HTTP calls.

CLI — reparatio-cli

Install once with pipx or uv; use the reparatio command from any terminal.

pipx install reparatio-cli
reparatio key set rp_YOUR_KEY
reparatio convert sales.csv sales.parquet
reparatio inspect report.xlsx
View on GitHub →

In early alpha — interfaces may change. Requires a Professional subscription API key.

Supported Formats

Input

CSV  ·  TSV  ·  GZ (any supported format inside)  ·  ZIP (any supported format inside)  ·  BZ2 (any supported format inside)  ·  ZST (any supported format inside)
Excel (.xlsx, .xls)  ·  ODS
JSON  ·  JSON Lines  ·  GeoJSON
YAML (.yaml, .yml)  ·  XML  ·  BSON
SQL dump (.sql)  ·  SQLite (.sqlite, .db)
Parquet  ·  Feather  ·  Arrow  ·  ORC  ·  Avro
PDF (text-layer tables)  ·  HTML tables
Markdown tables (.md, .markdown)
Subtitles (.srt, .vtt)

Output

CSV  ·  TSV  ·  CSV.GZ  ·  CSV.BZ2  ·  CSV.ZST  ·  CSV.ZIP  ·  TSV.GZ  ·  TSV.BZ2  ·  TSV.ZST  ·  TSV.ZIP
Excel (.xlsx)  ·  ODS
JSON  ·  JSON.GZ  ·  JSON.BZ2  ·  JSON.ZST  ·  JSON.ZIP  ·  JSON Lines  ·  JSON Lines GZ  ·  JSON Lines BZ2  ·  JSON Lines ZST  ·  JSON Lines ZIP
GeoJSON  ·  GeoJSON.GZ  ·  GeoJSON.BZ2  ·  GeoJSON.ZST  ·  GeoJSON.ZIP
YAML  ·  BSON
SQLite
Parquet  ·  Feather  ·  Arrow  ·  ORC  ·  Avro
Subtitles (.srt, .vtt)

Gzip (.csv.gz, .tsv.gz, etc.), bzip2 (.csv.bz2, etc.), Zstandard (.csv.zst, etc.), and ZIP archives are decompressed automatically on input — the first file inside a ZIP is used. Hive-partitioned Parquet: upload a ZIP containing only .parquet files to load them as a single merged dataset; partition columns are automatically extracted from key=value directory names (e.g. year=2024/region=west/data.parquet).

Convert

The main tab. Upload a file, preview the schema and first 8 rows, then download in any output format.

Merge

Combine two or more files into one. Select both files — shared columns are detected automatically for join operations.

Use Preview Result to inspect the first 8 rows before downloading. A warning is shown if columns are mismatched on append.

Append

Stack rows from two or more files into a single output. Available as a dedicated tab in the web UI (between Merge and SQL). Columns are matched by name; columns missing from some files are filled with null.

SQL Query

Run a SQL query directly against an uploaded file. The file is loaded as a table named data.

JSON Flattener

Available for all users; unlimited nesting depth requires a Standard or Professional subscription. After previewing a .json or .jsonl file, a Flatten nested JSON checkbox appears in the options row. When checked, nested objects are expanded into flat columns using _ as a separator (e.g. address_city).

Data Cleaner

Standard or Professional subscribers only. After previewing a file on the Convert tab, a Clean This File button appears below the preview. Click it to apply the selected cleaning operations in one step. The preview updates immediately and the download button uses the cleaned data.

After cleaning, a summary is shown: e.g. "Removed 2,347 duplicate rows · Dropped 3 empty columns · Fixed 45 placeholders." The cleaned file is held in the 15-minute cache; use Download Converted File to save it in your chosen format.

File Splitter

Standard or Professional subscribers only. Upload a large file and split it into multiple smaller files, downloaded as a single ZIP archive.

Format Notes

YAML (.yaml, .yml) — input & output

YAML files are expected to contain a list of records at the top level (the same shape as a JSON array of objects). A single-record YAML document is also accepted.

Nested keys are flattened with _ separators on read (e.g. address_city). On write, each row becomes a YAML mapping in a top-level sequence.

XML (.xml) — input only

XML is parsed via xmltodict and then flattened with pd.json_normalize. This works reliably for simple data-export XML (e.g. a root element containing a list of repeated child elements).

⚠ XML is a document format, not a tabular one. The parser makes a best-effort attempt to find a list of records inside your document. Results depend entirely on the shape of the XML:

  • Deeply nested or mixed-content documents may produce many columns with sparse data.
  • XML attributes become columns prefixed with @.
  • Repeated sibling elements at the same level are treated as a list of records — if there is only one sibling, it may be parsed as a single dict instead.
  • XML with namespaces will include the namespace prefix in column names.

If the result looks wrong, inspect the raw XML structure and consider flattening it manually before uploading.

SQL dump (.sql) — input only

Accepts mysqldump, phpMyAdmin exports, and similar MySQL-dialect dumps. The file is parsed with sqlparse, MySQL-specific syntax is stripped, and the selected table's CREATE TABLE + INSERT INTO statements are replayed into a temporary in-memory SQLite database.

Use the Sheet / Table picker to choose which table to extract. The picker shows the number of INSERT statements per table as a rough row-count proxy (multi-row INSERTs count as one statement).

⚠ PostgreSQL pg_dump and dumps that use stored procedures, custom types, or COPY statements are not fully supported. Basic INSERT-based pg_dump output usually works.

PDF (.pdf) — input only

Tables are extracted from the PDF's text layer using pdfplumber. The Sheet / Table picker lists every table found across all pages, labelled by page number.

⚠ PDF extraction has hard limits — it reads text that is already present in the file. It does not perform OCR. Scanned PDFs (images of pages with no text layer) will return no tables. OCR support is planned for a future release.

⚠ Table detection quality depends on the PDF. Tables with merged cells, rotated text, irregular spacing, or drawn without visible rules may produce garbled or incomplete results. Always preview before downloading.

HTML tables (.html, .htm) — input only

Every <table> element in the page is extracted via pandas.read_html. Use the Sheet / Table picker to choose which table to use.

Headers are inferred from <th> elements. Multi-level column headers are joined with a space. Inline formatting and links are ignored.

Markdown tables (.md, .markdown) — input only

GitHub-flavoured Markdown pipe tables are extracted using a pure-Python regex parser (no dependencies). If the file contains more than one table, the Sheet / Table picker appears so you can choose which one to use.

All cell values are treated as plain text strings. Column alignment markers in the separator row are ignored.

Subtitles (.srt, .vtt) — input & output

Subtitle files are parsed into a four-column table: index, start_time, end_time, text. Timestamps are normalised to HH:MM:SS.mmm. Inline HTML and VTT cue tags are stripped from the text.

On output, the index, start_time, end_time, and text columns are used if present; missing columns are filled with defaults. This means you can translate subtitles by editing the text column (e.g. via the SQL Query tab) and then export back to SRT or VTT.

SRT uses comma as the millisecond separator (00:00:01,500); VTT uses a dot (00:00:01.500) and includes a WEBVTT header.

BSON (.bson) — input & output

Reads MongoDB dump files produced by mongodump (raw concatenated BSON document format). Each document becomes a row; nested fields are flattened with _ separators.

On output, each row is encoded as a separate BSON document and written sequentially — compatible with mongorestore.

⚠ BSON-specific types (ObjectId, Decimal128, Binary, etc.) are converted to their string representations when flattening. They are not restored on round-trip write.

Free Tier & Row Limits

No account or payment is required to try anything. Anonymous users get up to 100 rows per conversion and 10 conversions per day. Register and verify your email for 250 rows and 25 conversions per day — still free.

If the output exceeds the row limit and you have not entered an access key, the download will contain only the allowed rows. This applies to Convert, Merge, Append, and SQL Query alike.

To download full files without row limits, see the Pricing page.

Plans: Standard ($29/mo) for unlimited rows and all formats; Professional ($79/mo) adds API, CLI, MCP, Fixed-Width, and EBCDIC; Credits ($10 = 25 conversions) for pay-as-you-go use. Credits never expire.

Other Limits

Error Messages

When something goes wrong, Reparatio shows the original technical error from the processing engine alongside a plain-English explanation. The technical message is selectable so you can copy it for a support request; the explanation beneath it describes what likely went wrong and what to try.

Conversion Warnings

Some conversions work well in every case. Others depend on the shape of your data.

JSON / JSON Lines / YAML / BSON → CSV, TSV, or Excel

Works well only if your data is a flat list of objects with consistent keys. Nested objects are flattened with _ separators (e.g. address_city). Fields that contain arrays will likely produce unreadable results or errors.

Any format → GeoJSON

Requires a column named geometry containing valid WKT geometry strings (e.g. POINT (0 0)). If no such column exists, the conversion will fail. Converting from GeoJSON always produces a geometry column, so GeoJSON → GeoJSON always works.

GeoJSON → CSV, TSV, or Excel

Works, but geometry is stored as a plain WKT text string. The spatial information is preserved as text, but the output file will not be recognized as a spatial format by GIS tools.

Avro — Boolean columns

Boolean columns do not survive an Avro round-trip cleanly. They are read back as integers (0 / 1). If boolean semantics matter, convert to a different format first.

REST API

The Reparatio REST API lets you convert, inspect, merge, query, append, and parse fixed-width and EBCDIC mainframe files programmatically. A Professional subscription is required for all endpoints that produce output files.

Base URL: https://reparatio.app/api/v1

Interactive reference (ReDoc): https://reparatio.app/api/redoc

Try-it console (Swagger UI): https://reparatio.app/api/docs

OpenAPI schema (JSON): https://reparatio.app/api/openapi.json

Higher-level wrappers (alpha)

If you prefer not to write raw HTTP calls, Reparatio provides SDKs for Python, JavaScript/TypeScript, Common Lisp, Java, and C#.

Python SDK — reparatio-sdk-py

github.com/jfrancis42/reparatio-sdk-py

pip install reparatio

from reparatio import Reparatio
with Reparatio(api_key="rp_...") as client:
    result = client.inspect("data.csv")
    out = client.convert("data.csv", "parquet")
    open(out.filename, "wb").write(out.content)

JavaScript / TypeScript SDK — reparatio-sdk-js

github.com/jfrancis42/reparatio-sdk-js

npm install reparatio

import { Reparatio } from "reparatio";
const client = new Reparatio("rp_YOUR_KEY");

const result = await client.inspect(file, "data.csv");
const { data, filename } = await client.convert(file, "parquet", "data.csv");
const { data: zip } = await client.batchConvert(zipFile, "parquet");

Common Lisp SDK — reparatio-sdk-cl

github.com/jfrancis42/reparatio-sdk-cl

; Requires SBCL + Quicklisp
(ql:quickload "reparatio")
(use-package :reparatio)
(let ((c (make-client :api-key "rp_...")))
  (inspect-file c #p"data.csv")
  (let ((r (convert c #p"data.csv" "parquet")))
    (reparatio-result-content r)))

Java SDK — reparatio-sdk-java

github.com/jfrancis42/reparatio-sdk-java

// Requires Java 11+ (no external deps)
import com.reparatio.ReparatioClient;
var client = new ReparatioClient("rp_...");
var info   = client.inspect(Path.of("data.csv"));
var result = client.convert(Path.of("data.csv"), "parquet");
Files.write(Path.of(result.filename()), result.content());

C# SDK — reparatio-sdk-cs

github.com/jfrancis42/reparatio-sdk-cs

// Requires .NET 6+ or Mono
using Reparatio;
var client = new ReparatioClient("rp_...");
var info   = await client.InspectAsync("data.csv");
var result = await client.ConvertAsync("data.csv", "parquet");
File.WriteAllBytes(result.Filename, result.Content);

Ruby SDK — reparatio-sdk-rb

github.com/jfrancis42/reparatio-sdk-rb

# gem install reparatio
require "reparatio"
client = Reparatio.new(api_key: "rp_...")
info   = client.inspect("data.csv")
result = client.convert("data.csv", "parquet")
File.binwrite(result.filename, result.content)

Requires a Professional plan API key ($79/mo).

Authentication

Pass your API key in the X-API-Key request header. Keys are issued after purchase on the Pricing tab.

API access requires a Professional subscription. See Pricing.

X-API-Key: rp_xxxxxxxxxxxxxxxxxxxx

The /health, /formats, and /inspect endpoints do not require authentication. All other endpoints require a Professional subscription.

Common Parameters

Requests that accept a file use multipart/form-data. Parameters are form fields unless noted otherwise.

ParameterTypeDefaultDescription
no_headerboolfalseTreat the first row of CSV/TSV as data, not a header. Columns will be named col_0, col_1, …
fix_encodingbooltrueAuto-detect and repair character encoding (mojibake). Recommended for files from legacy systems.
delimiterstring""Column separator for CSV-like files. Leave empty to auto-detect.
sheetstring""Sheet or table name for Excel, ODS, SQLite, HTML, PDF, and SQL dump files. Leave empty for the first sheet.

Response Headers

HeaderWhen presentDescription
Content-DispositionAll file downloadsSuggested filename for the converted output.
X-Reparatio-Warning/merge, /appendHuman-readable warning, e.g. "Column mismatch — missing values filled with null."

Error Codes

StatusMeaning
400Bad request — e.g. SQL syntax error, unknown merge operation.
401Missing or invalid X-API-Key header.
403Subscription inactive or plan does not include API access (Professional plan required).
413File too large — maximum 2 GB per file (Professional). 500 MB (Standard).
422File could not be parsed — check format and encoding.

Error responses are JSON: {"detail": "human readable message"}.

Endpoints

GET /health No auth required

Liveness check. Returns immediately with no side effects.

{"status": "healthy", "version": "1"}
GET /formats No auth required

Returns the lists of supported input and output format identifiers.

{"input": ["csv", "tsv", "xlsx", ...], "output": ["csv", "tsv", "parquet", ...]}
GET /me Pro

Returns subscription details for the provided API key.

{"email": "you@example.com", "plan": "pro", "tier": "pro", "expires_at": "2026-04-14T00:00:00+00:00", "api_access": true, "active": true, "credits_balance": 0, "email_verified": true}

credits_balance — remaining pay-as-you-go credits (credits plans only; 0 for subscription plans).

POST /inspect No auth required

Inspect a file without converting it. Returns schema, detected encoding, row count, sheet names, per-column stats, and a data preview.

ParameterTypeDefaultDescription
filefile (required)The data file to inspect.
no_headerboolfalseSee Common Parameters.
fix_encodingbooltrueSee Common Parameters.
delimiterstring""See Common Parameters.
sheetstring""See Common Parameters.
preview_rowsint8Number of preview rows to return (1–100).

Response: filename, detected_encoding, rows, sheets, columns[] (name, dtype, null_count, unique_count), preview[].

POST /convert Pro

Convert a file to a different format. Returns the converted file as a binary download.

ParameterTypeDefaultDescription
filefile (required)The file to convert.
target_formatstring (required)Output format: csv, tsv, csv.gz, csv.bz2, csv.zst, csv.zip, tsv.gz, tsv.bz2, tsv.zst, tsv.zip, xlsx, ods, json, json.gz, json.bz2, json.zst, json.zip, jsonl, jsonl.gz, jsonl.bz2, jsonl.zst, jsonl.zip, geojson, geojson.gz, geojson.bz2, geojson.zst, geojson.zip, parquet, feather, arrow, orc, avro, sqlite. See /formats.
no_headerboolfalseSee Common Parameters.
fix_encodingbooltrueSee Common Parameters.
delimiterstring""See Common Parameters.
sheetstring""See Common Parameters.
columnsJSON array[]Rename columns. Supply an array of new names in the same order as the source columns. Must match the column count exactly, or is ignored.
select_columnsJSON array[]Include only the named columns in the output. Order is preserved.
deduplicateboolfalseRemove duplicate rows, keeping the first occurrence.
deduplicate_onJSON array[]Column names to use for deduplication key. Empty array deduplicates on all columns.
sample_nint0Return a random sample of exactly N rows. Takes priority over sample_frac.
sample_fracfloat0.0Return a random fraction of rows, e.g. 0.1 for 10%.
geometry_columnstring"geometry"Column containing WKT or GeoJSON geometry, used when outputting to GeoJSON.
cast_columnsJSON object{}Override inferred column types. Keys are column names; values are objects with "type" (required) and optional "format" for date parsing. Example: {"price":{"type":"Float64"},"date":{"type":"Date","format":"%d/%m/%Y"}}. Supported types: String, Int8Int64, UInt8UInt64, Float32, Float64, Boolean, Date, Datetime, Time. Failed casts are silently coerced to null.
null_valuesstring (JSON array)[]Strings to treat as null at load time, e.g. ["N/A","NULL","-"]. Passed as Polars null_values=.
encoding_overridestring""Force a specific encoding, bypassing chardet auto-detection. Pass any Python codec name, e.g. cp037 (EBCDIC US), cp500 (EBCDIC International), cp1026 (EBCDIC Turkish), cp1140 (EBCDIC US+Euro). Leave empty to auto-detect.
preview_onlyboolfalseIf true, return the first 8 rows as JSON instead of the converted file. Useful for previewing before downloading.
webhook_urlstring""Optional HTTPS URL to receive a completion notification. When provided, the converted file is cached for 15 minutes and a JSON job receipt is returned immediately (see Webhooks). Must be a public HTTPS endpoint — private and loopback IPs are blocked.

Response (normal): binary file stream with Content-Disposition: attachment; filename="…". When preview_only=true, returns a JSON array of row objects instead. When webhook_url is set, returns a JSON job receipt instead of the file (see Webhooks).

POST /batch-convert Pro

Accept a ZIP of input files, convert each file to target_format, and return a ZIP of converted files. Files that cannot be parsed are skipped; their names and error messages are returned in the X-Reparatio-Errors response header as a URL-encoded JSON array of {"file","error"} objects.

ParameterTypeDefaultDescription
zip_filefile (required)ZIP archive containing the input files.
target_formatstring (required)Output format for every file. Same values as /convert.
no_headerboolfalseSee Common Parameters.
fix_encodingbooltrueSee Common Parameters.
delimiterstring""See Common Parameters.
select_columnsJSON array[]Include only the named columns in the output.
deduplicateboolfalseRemove duplicate rows from each file.
deduplicate_onJSON array[]Deduplication key columns.
sample_nint0Random sample of N rows per file.
sample_fracfloat0.0Random sample fraction per file.
cast_columnsJSON object{}Column type overrides applied to every file. Same format as /convert.
webhook_urlstring""Optional HTTPS URL to receive a completion notification. When provided, the converted ZIP is cached for 15 minutes and a JSON job receipt is returned immediately (see Webhooks). Must be a public HTTPS endpoint.

Response (normal): application/zip with Content-Disposition: attachment; filename="converted.zip". If any files were skipped, X-Reparatio-Errors contains a URL-encoded JSON array. When webhook_url is set, returns a JSON job receipt instead (see Webhooks).

GET /download/{token} Pro

Download a converted file using the job_id returned by a webhook-mode conversion. Tokens are valid for 15 minutes after the conversion completes. Requires the same API key that submitted the job.

Response: binary file stream with appropriate Content-Type and Content-Disposition headers. Returns HTTP 404 if the token is expired or unknown.

Webhooks

When webhook_url is supplied to /convert or /batch-convert, the conversion runs synchronously and the server makes a single POST to your URL after the job finishes. The converted file is cached for 15 minutes and retrievable via GET /api/v1/download/{job_id}.

The same JSON object is returned in the API response and POSTed to your webhook endpoint, so you can treat the initial response as the receipt and use the webhook as a secondary notification.

Webhook request headers

HeaderValue
Content-Typeapplication/json
User-AgentReparatio-Webhook/1.0
X-Reparatio-Signaturesha256=<hex> — HMAC-SHA256 of the raw request body, keyed with your WEBHOOK_SECRET. Only present if WEBHOOK_SECRET is configured on the server. Verify this to confirm the request originated from Reparatio.

Payload schema — conversion.completed

FieldTypeDescription
eventstringAlways "conversion.completed".
job_idstring (UUID)Unique identifier for this job. Use with GET /api/v1/download/{job_id} to retrieve the file.
statusstringAlways "completed" (errors that prevent any output raise HTTP 4xx before the webhook fires).
download_urlstringFull URL to retrieve the converted file. Valid for 15 minutes.
filenamestringSuggested download filename, e.g. "sales.parquet" or "converted.zip".
input_formatstringDetected input format, e.g. "csv". "zip" for batch jobs.
output_formatstringRequested output format.
input_bytesintSize of the uploaded file in bytes.
output_bytesintSize of the converted output in bytes.
elapsed_msintServer-side conversion time in milliseconds.
files_convertedintNumber of files successfully converted. Batch-convert only.
timestampstring (ISO 8601)UTC timestamp of job completion.
errorsarrayArray of {"file","error"} objects for files that could not be converted. Empty for single-file jobs. Non-empty does not prevent the webhook from firing — at least one file converted successfully.

Example payload

{
  "event":           "conversion.completed",
  "job_id":          "a3f7c2d1-84b0-4e19-9f6a-0c1d2e3f4a5b",
  "status":          "completed",
  "download_url":    "https://reparatio.app/api/v1/download/a3f7c2d1-...",
  "filename":        "sales.parquet",
  "input_format":    "csv",
  "output_format":   "parquet",
  "input_bytes":     204800,
  "output_bytes":    51200,
  "elapsed_ms":      312,
  "timestamp":       "2026-03-14T18:42:00.123456+00:00",
  "errors":          []
}

Signature verification (Python example)

import hmac, hashlib

def verify_signature(body: bytes, header: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(
        secret.encode(), body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, header)
POST /merge Pro

Merge or join exactly two files. Returns the merged file as a binary download.

ParameterTypeDefaultDescription
file1file (required)First (left) file.
file2file (required)Second (right) file.
operationstring (required)One of: append, inner, left, right, outer. Use append to stack rows; the join variants require join_on.
join_onstring""Comma-separated column names to join on, e.g. id,date. Required for join operations.
target_formatstring (required)Output format identifier.
no_headerboolfalseSee Common Parameters.
fix_encodingbooltrueSee Common Parameters.
geometry_columnstring"geometry"See /convert.

Response: binary file stream. Check X-Reparatio-Warning for column-mismatch notices.

POST /append Pro

Stack rows from two or more files into a single output. Columns are matched by name; missing values are filled with null.

ParameterTypeDefaultDescription
filesfile[] (required)Two or more files to stack. Send multiple files fields in the same form.
target_formatstring (required)Output format identifier.
no_headerboolfalseSee Common Parameters.
fix_encodingbooltrueSee Common Parameters.

Response: binary file stream named appended.<ext>. Check X-Reparatio-Warning for column-mismatch notices.

POST /query Pro

Execute a SQL SELECT query against a file and return the result as a download. The file is loaded as a table named data.

ParameterTypeDefaultDescription
filefile (required)The file to query.
sqlstring (required)A SQL query. Reference the file as data, e.g. SELECT * FROM data WHERE amount > 100.
target_formatstring"csv"Output format for the query result.
no_headerboolfalseSee Common Parameters.
fix_encodingbooltrueSee Common Parameters.
delimiterstring""See Common Parameters.
sheetstring""See Common Parameters.

Response: binary file stream named <original_name>_query.<ext>.

EBCDIC & Fixed-Width Format (Professional)

Reparatio can decode IBM EBCDIC mainframe files and parse fixed-width column layouts. Both features require a Professional subscription and are accessed through dedicated endpoints.

POST /api/v1/convert EBCDIC encoding override

Pass encoding_override to force an EBCDIC code page. Reparatio will auto-detect EBCDIC in most cases, but explicit override is recommended for production pipelines.

Code pageDescription
cp037IBM US/Canada — most common North American mainframe encoding
cp500IBM International — common in European mainframe installs
cp1047IBM z/OS Unix Services
cp1140IBM US with Euro sign (€) — modern billing systems
cp273IBM Germany / Austria
cp285IBM United Kingdom
cp297IBM France
cp875IBM Greece
curl -X POST https://reparatio.app/api/v1/convert \
  -H "X-API-Key: rp_xxxxxxxxxxxxxxxxxxxx" \
  -F "file=@mainframe_export.dat" \
  -F "target_format=csv" \
  -F "encoding_override=cp037" \
  -o output.csv
POST /api/v1/fwf-detect Auto-detect column boundaries

Upload a fixed-width file; Reparatio analyses whitespace density to suggest column split positions. Returns a JSON array of boundary offsets and suggested column names.

ParameterTypeDefaultDescription
filefile (required)Fixed-width text file to analyse.
encoding_overridestring""Force encoding (e.g. cp037). Leave empty to auto-detect.
skip_rowsint0Number of header/metadata rows to skip before data begins.
curl -X POST https://reparatio.app/api/v1/fwf-detect \
  -H "X-API-Key: rp_xxxxxxxxxxxxxxxxxxxx" \
  -F "file=@report.txt" \
  -F "encoding_override=cp037"
POST /api/v1/fwf-convert Parse and convert a fixed-width file

Convert a fixed-width file to any supported output format using explicit column boundaries. Typically called after /fwf-detect to confirm boundaries, then again with user-adjusted positions and column names.

ParameterTypeDefaultDescription
filefile (required)Fixed-width text file.
boundariesstring (required)JSON array of integer column start positions, e.g. [0,10,25,40].
col_namesstring""JSON array of column names. If omitted, columns are named col_0, col_1, etc.
target_formatstring"csv"Output format (csv, xlsx, parquet, json, tsv, …).
encoding_overridestring""Force encoding (e.g. cp037).
skip_rowsint0Rows to skip before data.
strip_charstring""Character to strip from cell values (e.g. | for pipe-padded files).
curl -X POST https://reparatio.app/api/v1/fwf-convert \
  -H "X-API-Key: rp_xxxxxxxxxxxxxxxxxxxx" \
  -F "file=@report.txt" \
  -F 'boundaries=[0,10,25,40,60]' \
  -F 'col_names=["id","name","dept","salary","hire_date"]' \
  -F "target_format=parquet" \
  -F "encoding_override=cp037" \
  -o report.parquet

Code Examples

All examples convert data.csv to Parquet using the /api/v1/convert endpoint.

curl

curl -X POST https://reparatio.app/api/v1/convert \
  -H "X-API-Key: rep_live_xxxxxxxxxxxxxxxxxxxx" \
  -F "file=@data.csv" \
  -F "target_format=parquet" \
  -o data.parquet

Python

import httpx

API_KEY = "rep_live_xxxxxxxxxxxxxxxxxxxx"
BASE    = "https://reparatio.app/api/v1"

with open("data.csv", "rb") as f:
    resp = httpx.post(
        f"{BASE}/convert",
        headers={"X-API-Key": API_KEY},
        data={"target_format": "parquet"},
        files={"file": ("data.csv", f, "text/csv")},
        timeout=120,
    )
resp.raise_for_status()

with open("data.parquet", "wb") as out:
    out.write(resp.content)

print("Saved data.parquet")

JavaScript

const API_KEY = "rep_live_xxxxxxxxxxxxxxxxxxxx";
const BASE    = "https://reparatio.app/api/v1";

async function convertFile(file, targetFormat) {
  const form = new FormData();
  form.append("file", file);
  form.append("target_format", targetFormat);

  const resp = await fetch(`${BASE}/convert`, {
    method: "POST",
    headers: { "X-API-Key": API_KEY },
    body: form,
  });

  if (!resp.ok) {
    const err = await resp.json();
    throw new Error(err.detail);
  }

  const blob = await resp.blob();
  const url  = URL.createObjectURL(blob);
  const a    = document.createElement("a");
  a.href     = url;
  a.download = "data.parquet";
  a.click();
  URL.revokeObjectURL(url);
}

// Usage (browser — pass a File object from an <input> element):
// convertFile(fileInput.files[0], "parquet");

Common Lisp

;;; Requires: drakma
;;; (ql:quickload :drakma)

(defparameter *api-key* "rep_live_xxxxxxxxxxxxxxxxxxxx")
(defparameter *base*    "https://reparatio.app/api/v1")

(defun convert-file (input-path target-format output-path)
  "Convert INPUT-PATH to TARGET-FORMAT and write the result to OUTPUT-PATH.
  INPUT-PATH may be a string or pathname; OUTPUT-PATH is written as binary."
  (let ((path (pathname input-path)))
    (multiple-value-bind (body status)
        (drakma:http-request
         (format nil "~A/convert" *base*)
         :method              :post
         :form-data           t
         :force-binary        t
         :additional-headers  `(("X-API-Key" . ,*api-key*))
         ;; File parameters are lists: (field-name pathname content-type filename)
         ;; String parameters are conses: (field-name . value)
         :parameters          `(("file"          ,path "application/octet-stream" ,(file-namestring path))
                                 ("target_format" . ,target-format)))
      (unless (= status 200)
        (error "API error ~A" status))
      (with-open-file (out output-path
                           :direction    :output
                           :element-type '(unsigned-byte 8)
                           :if-exists    :supersede)
        (write-sequence body out))
      (format t "Saved ~A~%" output-path))))

(convert-file "data.csv" "parquet" "data.parquet")

C#

using System.Net.Http;
using System.Net.Http.Headers;

const string ApiKey  = "rep_live_xxxxxxxxxxxxxxxxxxxx";
const string BaseUrl = "https://reparatio.app/api/v1";

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", ApiKey);
client.Timeout = TimeSpan.FromSeconds(120);

await using var fileStream = File.OpenRead("data.csv");
var content = new MultipartFormDataContent();
content.Add(new StreamContent(fileStream), "file", "data.csv");
content.Add(new StringContent("parquet"), "target_format");

var response = await client.PostAsync($"{BaseUrl}/convert", content);
response.EnsureSuccessStatusCode();

var bytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("data.parquet", bytes);
Console.WriteLine("Saved data.parquet");

Java

// Requires Java 11+ (java.net.http is in the standard library)
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;
import java.nio.file.*;

public class ReparatioExample {
    static final String API_KEY  = "rep_live_xxxxxxxxxxxxxxxxxxxx";
    static final String BASE_URL = "https://reparatio.app/api/v1";

    public static void main(String[] args) throws Exception {
        byte[] fileBytes = Files.readAllBytes(Path.of("data.csv"));
        String boundary  = "----ReparatioBoundary";

        String body = "--" + boundary + "\r\n"
            + "Content-Disposition: form-data; name=\"file\"; filename=\"data.csv\"\r\n"
            + "Content-Type: application/octet-stream\r\n\r\n";
        byte[] bodyStart  = body.getBytes();
        byte[] fieldPart  = ("\r\n--" + boundary + "\r\n"
            + "Content-Disposition: form-data; name=\"target_format\"\r\n\r\n"
            + "parquet\r\n--" + boundary + "--\r\n").getBytes();

        byte[] requestBody = new byte[bodyStart.length + fileBytes.length + fieldPart.length];
        System.arraycopy(bodyStart, 0, requestBody, 0,                               bodyStart.length);
        System.arraycopy(fileBytes, 0, requestBody, bodyStart.length,                fileBytes.length);
        System.arraycopy(fieldPart, 0, requestBody, bodyStart.length + fileBytes.length, fieldPart.length);

        HttpClient client   = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/convert"))
            .header("X-API-Key", API_KEY)
            .header("Content-Type", "multipart/form-data; boundary=" + boundary)
            .POST(BodyPublishers.ofByteArray(requestBody))
            .build();

        HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
        if (response.statusCode() != 200) throw new RuntimeException("API error: " + response.statusCode());

        Files.write(Path.of("data.parquet"), response.body());
        System.out.println("Saved data.parquet");
    }
}

Inspect a file (curl)

curl -X POST https://reparatio.app/api/v1/inspect \
  -F "file=@data.xlsx" \
  -F "preview_rows=5"

SQL query (curl)

curl -X POST https://reparatio.app/api/v1/query \
  -H "X-API-Key: rep_live_xxxxxxxxxxxxxxxxxxxx" \
  -F "file=@sales.csv" \
  -F "sql=SELECT region, SUM(amount) AS total FROM data GROUP BY region ORDER BY total DESC" \
  -F "target_format=csv" \
  -o summary.csv

Join two files (curl)

curl -X POST https://reparatio.app/api/v1/merge \
  -H "X-API-Key: rep_live_xxxxxxxxxxxxxxxxxxxx" \
  -F "file1=@customers.csv" \
  -F "file2=@orders.csv" \
  -F "operation=left" \
  -F "join_on=customer_id" \
  -F "target_format=parquet" \
  -o customers_with_orders.parquet

MCP Server

Alpha Software

The Reparatio MCP server is in early alpha. Interfaces, tool names, and behaviour may change without notice. Use it in production at your own risk and report issues via the Support tab.

MCP access requires a Professional subscription ($79/mo). See Pricing.

reparatio-mcp on GitHub

MCP server — Python 3.11+, MIT-licensed. Requires uv or pip.

View on GitHub

reparatio-cli on GitHub (alpha)

Command-line tool — pipx install reparatio-cli · MIT-licensed.

View on GitHub

reparatio-sdk-py on GitHub (alpha)

Python SDK — pip install reparatio · MIT-licensed.

View on GitHub

How it works

The MCP server runs locally on your machine. When your AI assistant calls a tool, the server reads the file from your disk, sends it to the Reparatio API for processing, and writes the result back to disk — returning the output path to the assistant. Binary data never passes through the MCP protocol layer; only file paths and options travel as JSON.

Prerequisites

uvx (from uv) is the recommended way to run the server — no install step required:

curl -LsSf https://astral.sh/uv/install.sh | sh

Installation

Option A — run without installing (recommended):

uvx reparatio-mcp

Option B — install permanently:

pip install reparatio-mcp

Client Configuration

MCP is a client-side protocol. Your AI assistant application needs to support MCP tool calls. The LLM backend (Claude, GPT-4o, Grok, DeepSeek, Gemini, a local Ollama model, etc.) is configured separately inside each client — the MCP server works with any of them.

Claude Desktop

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json  ·  Windows: %APPDATA%\Claude\claude_desktop_config.json  ·  Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "reparatio": {
      "command": "uvx",
      "args": ["reparatio-mcp"],
      "env": { "REPARATIO_API_KEY": "rp_YOUR_KEY" }
    }
  }
}

Restart Claude Desktop after saving.

Cursor

Global: ~/.cursor/mcp.json  ·  Per-project: .cursor/mcp.json in your project root

{
  "mcpServers": {
    "reparatio": {
      "command": "uvx",
      "args": ["reparatio-mcp"],
      "env": { "REPARATIO_API_KEY": "rp_YOUR_KEY" }
    }
  }
}

Reload the MCP server list in Cursor Settings → MCP after saving.

Windsurf

Edit ~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "reparatio": {
      "command": "uvx",
      "args": ["reparatio-mcp"],
      "env": { "REPARATIO_API_KEY": "rp_YOUR_KEY" }
    }
  }
}

VS Code — GitHub Copilot

VS Code 1.99+. Add to settings.json (Ctrl+Shift+P → "Open User Settings (JSON)"):

{
  "mcp": {
    "servers": {
      "reparatio": {
        "type": "stdio",
        "command": "uvx",
        "args": ["reparatio-mcp"],
        "env": { "REPARATIO_API_KEY": "rp_YOUR_KEY" }
      }
    }
  }
}

VS Code / JetBrains — Continue

Edit ~/.continue/config.json. Continue supports OpenAI, Anthropic, DeepSeek, Grok, Gemini, Ollama, and more.

{
  "mcpServers": [
    {
      "name": "reparatio",
      "command": "uvx",
      "args": ["reparatio-mcp"],
      "env": { "REPARATIO_API_KEY": "rp_YOUR_KEY" }
    }
  ]
}

Zed

Edit ~/.config/zed/settings.json

{
  "context_servers": {
    "reparatio": {
      "command": {
        "path": "uvx",
        "args": ["reparatio-mcp"],
        "env": { "REPARATIO_API_KEY": "rp_YOUR_KEY" }
      }
    }
  }
}

Open WebUI (Ollama and others)

Go to Settings → Tools → MCP Servers, add a new server with command uvx reparatio-mcp and environment variable REPARATIO_API_KEY=rp_YOUR_KEY. Works with any Ollama model.

Claude Code (CLI)

Add to your project's .mcp.json file:

{
  "mcpServers": {
    "reparatio": {
      "command": "uvx",
      "args": ["reparatio-mcp"],
      "env": { "REPARATIO_API_KEY": "rp_YOUR_KEY" }
    }
  }
}

Environment Variables

VariableDefaultDescription
REPARATIO_API_KEYYour rp_… API key from the Pricing tab.

Available Tools

inspect_file No API key required

Detect encoding, count rows, list column types and statistics, and return a data preview. No API key required — works on the free tier.

ParameterTypeDefaultDescription
pathstring (required)Local file path.
no_headerboolfalseTreat first row as data (CSV/TSV).
fix_encodingbooltrueAuto-detect and repair encoding.
delimiterstring""Custom delimiter (auto-detected if blank).
sheetstring""Sheet or table name for Excel, ODS, SQLite.
preview_rowsint8Preview rows to return (1–100).
convert_file Pro

Convert a file to a different format. Optionally select or rename columns, deduplicate rows, or sample a subset. Saves the result to disk and returns the output path.

ParameterTypeDefaultDescription
input_pathstring (required)Source file path.
target_formatstring (required)Output format: csv, tsv, csv.gz, csv.bz2, csv.zst, csv.zip, tsv.gz, tsv.bz2, tsv.zst, tsv.zip, xlsx, ods, json, json.gz, json.bz2, json.zst, json.zip, jsonl, jsonl.gz, jsonl.bz2, jsonl.zst, jsonl.zip, geojson, geojson.gz, geojson.bz2, geojson.zst, geojson.zip, yaml, bson, srt, vtt, parquet, feather, arrow, orc, avro, sqlite.
output_pathstringautoWhere to save the result (default: same directory, extension changed).
no_headerboolfalseTreat first row as data.
fix_encodingbooltrueRepair encoding.
delimiterstring""Custom delimiter for CSV-like input.
sheetstring""Sheet or table to read.
columnsarray[]Rename columns — new names in order (must match column count).
select_columnsarray[]Columns to include in output (all if omitted).
deduplicateboolfalseRemove duplicate rows.
sample_nintRandom sample of N rows.
sample_fracfloatRandom sample fraction, e.g. 0.1 for 10%.
geometry_columnstring"geometry"WKT geometry column for GeoJSON output.
cast_columnsobject{}Override column types. E.g. {"price": "Float64", "date": "Date:%d/%m/%Y"}.
null_valuesarray[]Strings to treat as null at load time, e.g. ["N/A", "NULL", "-"].
encoding_overridestring""Force a specific encoding, bypassing auto-detection. E.g. cp037 (EBCDIC US), cp500 (EBCDIC International), cp1026 (EBCDIC Turkish), cp1140 (EBCDIC US+Euro). Leave blank to auto-detect.
batch_convert Pro

Convert every file inside a ZIP archive to a common format and return a ZIP of converted files. Files that cannot be parsed are skipped; their names and errors are returned in the output path's warning string.

ParameterTypeDefaultDescription
zip_pathstring (required)Path to ZIP archive containing input files.
target_formatstring (required)Output format for every file in the ZIP.
output_pathstringautoPath for the output ZIP (default: converted.zip in same directory).
select_columnsarray[]Columns to include from every file.
deduplicateboolfalseRemove duplicate rows from each file.
sample_nintRandom sample of N rows per file.
sample_fracfloatRandom sample fraction per file.
cast_columnsobject{}Column type overrides applied to every file.
merge_files Pro

Merge two files using a SQL-style join or append (row-stacking). Saves the result to disk and returns the output path.

ParameterTypeDefaultDescription
file1_pathstring (required)First (left) file path.
file2_pathstring (required)Second (right) file path.
operationstring (required)append, inner, left, right, or outer.
target_formatstring (required)Output format.
output_pathstringautoWhere to save the result.
join_onstring""Comma-separated column name(s) to join on (required for non-append operations).
no_headerboolfalseTreat first row as data.
fix_encodingbooltrueRepair encoding.
append_files Pro

Stack rows from two or more files vertically. Columns missing from some files are filled with null. Saves the result to disk.

ParameterTypeDefaultDescription
pathsarray (required)List of local file paths to append (minimum 2).
target_formatstring (required)Output format.
output_pathstringautoDefault: appended.{format} in directory of first file.
no_headerboolfalseTreat first row as data.
fix_encodingbooltrueRepair encoding.
query_file Pro

Run a SQL query against a file. The file is loaded as a table named data. Supports SELECT, WHERE, GROUP BY, ORDER BY, LIMIT, aggregations, and most scalar functions.

ParameterTypeDefaultDescription
pathstring (required)Source file path.
sqlstring (required)SQL query; reference the file as data.
target_formatstring"csv"Output format.
output_pathstringautoDefault: {stem}_query.{format}.
no_headerboolfalseTreat first row as data.
fix_encodingbooltrueRepair encoding.
delimiterstring""Custom delimiter for CSV-like input.
sheetstring""Sheet or table to read.
parse_fixed_width Pro

Parse a fixed-width or EBCDIC mainframe file and convert it to a structured format. Reparatio auto-detects column boundaries; pass explicit boundaries to override. Supports all IBM EBCDIC code pages via encoding_override.

ParameterTypeDefaultDescription
pathstring (required)Path to the fixed-width or EBCDIC file.
target_formatstring"csv"Output format (csv, xlsx, parquet, json, tsv, …).
output_pathstringautoDefault: {stem}_parsed.{format}.
boundariesarrayautoInteger column start positions, e.g. [0, 10, 25, 40]. If omitted, Reparatio detects boundaries automatically.
col_namesarrayautoColumn names. If omitted, columns are named col_0, col_1, etc.
encoding_overridestring""Force EBCDIC or other encoding. E.g. cp037 (US), cp500 (International), cp1047 (z/OS), cp1140 (US+Euro). Leave blank to auto-detect.
skip_rowsint0Metadata rows at the top of the file to skip.
strip_charstring""Character to remove from cell values (e.g. | for pipe-padded exports).

Supported Formats

FormatInputOutput
CSV
TSV
CSV.GZ (gzip)
CSV.BZ2 (bzip2)
CSV.ZST (zstd)
CSV.ZIP
TSV.GZ (gzip)
TSV.BZ2 (bzip2)
TSV.ZST (zstd)
TSV.ZIP
GZ (any supported format inside)
ZIP (any supported format inside)
BZ2 (any supported format inside)
ZST (any supported format inside)
Excel (.xlsx)
Excel (.xls, legacy)
ODS
JSON
JSON.GZ (gzip)
JSON.BZ2 (bzip2)
JSON.ZST (zstd)
JSON.ZIP
JSON Lines
JSON Lines GZ (gzip)
JSON Lines BZ2 (bzip2)
JSON Lines ZST (zstd)
JSON Lines ZIP
GeoJSON
GeoJSON.GZ (gzip)
GeoJSON.BZ2 (bzip2)
GeoJSON.ZST (zstd)
GeoJSON.ZIP
Parquet
Feather
Arrow
ORC
Avro
SQLite
YAML
BSON
SRT (subtitles)
VTT (subtitles)
HTML / HTM
Markdown
XML
SQL dump
PDF (text layer)
Fixed-Width / EBCDIC Pro

Example Prompts

Once connected, use natural language with your AI assistant:

Inspect ~/data/sales.csv and tell me about the schema.

Convert ~/data/sales.csv to Parquet.

Convert ~/data/report.xlsx, sheet "Q3", to CSV, selecting only the
"date", "region", and "revenue" columns.

Merge orders.csv and customers.csv on customer_id using a left join,
output as Parquet.

Append all the CSV files in ~/data/monthly/ into one file and save it
as ~/data/all_months.parquet.

Query ~/data/events.parquet: give me total revenue by region for 2025,
sorted descending, as a JSON file.

I have ~/data/legacy.csv from an old Windows system — fix the encoding
and convert it to Excel.

Convert ~/data/mainframe_export.dat — it's an EBCDIC cp037 fixed-width
file. Detect the column boundaries and convert it to Parquet.

Default Output Paths

ToolDefault output filename
convert_file{input_stem}.{target_format}
merge_files{file1_stem}_{operation}_{file2_stem}.{target_format}
append_filesappended.{target_format}
query_file{input_stem}_query.{target_format}
parse_fixed_width{input_stem}_parsed.{target_format}

Troubleshooting

"REPARATIO_API_KEY is not set"

The key is missing from the env block in your client config. The variable name must be exactly REPARATIO_API_KEY.

"uvx: command not found"

Install uv: curl -LsSf https://astral.sh/uv/install.sh | sh, then restart your terminal and your AI client.

"Insufficient plan"

The tool requires a Professional plan key ($79/mo). inspect_file is always free.

"File not found"

Use an absolute path starting with / or ~. Relative paths are resolved from the server process's working directory.

"Parse failure"

Try setting fix_encoding: true, specifying a delimiter, or confirming the file extension matches the actual format.

Tools not appearing in the client

Restart the client after editing the config. Confirm uvx is on the PATH visible to the client process — check with which uvx.

Privacy

Your files are sent to the Reparatio API at reparatio.app for processing. Files are handled in memory and never stored — see the Privacy Policy.

Support

Send a message and we'll get back to you as soon as possible.

Merge Files

Stack rows from two or more files, or join two files on a shared column.

File 1

No file chosen

File 2

No file chosen

Operation

Append Files

Stack rows from two or more files vertically. Column mismatches are handled gracefully — missing values are filled with null.

Multi-Sheet Excel Workbook

Write each file above as a separate sheet in a single .xlsx workbook (sheet name = filename).

Fixed-Width Parser

Upload a fixed-width text file. Reparatio will detect column boundaries automatically. Drag the dividers to adjust, click the ruler to add a column, double-click a divider to remove it, then export to any format.

No file chosen

SQL Query

Run a SQL query against an uploaded file. The table is always named data.

No file chosen

File Splitter

Split a large file into multiple smaller files, downloaded as a ZIP archive. Standard or Professional subscribers only.

No file chosen

Split by

Number of files:

Public Beta

BETA

Reparatio is in public beta. You're using it before most people have heard of it.

That means two things: you get free access to everything, and we genuinely need your help making it better.

Ready to get started? Register for free — no credit card, no password.

What "beta" means here

This isn't a marketing term. The product works — it handles real files, real formats, and real edge cases every day. But data is endlessly weird, and no amount of internal testing catches everything that real users throw at a real tool.

There are bugs we haven't found yet. There are formats that almost work but not quite. There are error messages that are confusing. There are features that should exist but don't. You will find some of these things. We want you to tell us when you do.

What we'll do about it

We read every report. When something is broken, we fix it — usually within 48 hours for serious issues. When a feature request makes sense for the product, we build it. When we fix something you reported, we'll tell you.

We're not a large team with a ticket queue and a six-week sprint cycle. We're a small shop that moves fast. If you report a real bug today, there's a good chance it's fixed by tomorrow.

Current beta limits

These limits exist to help us understand load before we open things up fully. They will increase over the course of the beta — we'll announce increases as they happen.

LimitValue
File size100 MB per file
Standard operations (inspect, convert, batch convert)50 per day
Professional operations (SQL query, merge, join, append)20 per day

Limits reset at midnight MDT. If you're hitting limits doing legitimate work, tell us — that's exactly the kind of feedback that helps us calibrate.

How to send feedback

The more specific you can be, the more useful it is. "The CSV export is broken" is hard to act on. "Converting a 40MB TSV with a pipe delimiter to Parquet returns a 422 error" is something we can fix today.

What happens at the end of the beta

The beta runs through April 15, 2026. Users who have been active will receive an offer for 50% off their first three months of a paid plan. No obligation, no pressure — but if Reparatio has been solving a real problem for you, it's a meaningful discount at the moment it matters most.

We'll send details before the beta ends.

Reparatio is the first product of Ordo Artificum LLC. We're building tools for people who work with messy data. If that's you, we're glad you're here.

Uploading file...

0%