DOCUMENTATION · V0.2.0
One engine. Three ways to use it.
Use the browser workspace, REST API, or MCP server. Custom files require a paid key. Fixed examples and demo reports are free. CSV contents and reports are never persisted by this service.
Connect an MCP client
Transport: stateless Streamable HTTP. Server URL:
https://check.orvel.dev/mcp
Connect anonymously to discover tools and run view_csv_demo {}. For your own files, buy a pack and configure the header Authorization: Bearer YOUR_API_KEY. Use a client that supports custom headers; OAuth-only clients cannot use paid operations in v0.1.
{
"mcpServers": {
"import-check": {
"type": "http",
"url": "https://check.orvel.dev/mcp",
"headers": {"Authorization": "Bearer YOUR_API_KEY"}
}
}
}This is a generic client configuration example; the enclosing settings format depends on your client. Store your key in the client's secret settings and keep it out of source control.
First prompt: “Run Import Check's free demo. Explain which rows fail and why.” Paid prompt: “Validate this CSV against these explicit column rules. Report problems before making changes.”
| Tool | Use | Credit |
|---|---|---|
| get_csv_example | Complete fixed CSV and schema to copy | Free |
| view_csv_demo | Run fixed sample through the live engine | Free |
| get_csv_usage | Remaining allowance; requires key | Free |
| validate_csv | Check supplied CSV and schema | 1 |
| clean_csv | Explicit changes, returned CSV, output validation | 1 |
Table recipes beta
Open the table workspace to inspect columns, prepare a file or reconcile two files. These operations use your existing pack: one completed report costs one operation, including blocked outputs. Fixed examples remain free.
| MCP tool | REST | Purpose |
|---|---|---|
| get_table_example | GET /v1/tables/example | Fixed tables and join recipe; free |
| view_table_demo | GET /v1/tables/demo | Fixed reconciliation; free, no arguments |
| inspect_table | POST /v1/tables/inspect | Profile strings, empty and duplicate counts; one operation |
| prepare_table | POST /v1/tables/prepare | Execute explicit column recipe; one operation |
| reconcile_tables | POST /v1/tables/reconcile | Exact-key join and complete findings; one operation |
First prompt: “Run the fixed table demo. Explain the changed and unmatched records.” For real data, supply a key and explicit column/key decisions. Do not infer that a changed amount is wrong or ask the tool to resolve ambiguous keys automatically.
Input formats
A table is either {"csv_text":"id,name\n001,Ada\n","delimiter":","} or {"columns":["id","name"],"rows":[["001","Ada"]]}. All JSON cells must be strings. Never send both forms. Delimiter defaults to comma; semicolon, tab and pipe are supported. Identifiers and leading zeros remain strings. No automatic type or delimiter guessing.
A reusable preparation recipe
{
"table": {"csv_text":"id,name,date\n001, Ada ,03/04/2026\n"},
"recipe": {
"version": 1,
"columns": [
{"name":"id", "source":"id"},
{"name":"name", "source":"name", "actions":["trim"]},
{"name":"date", "source":"date", "actions":["date_dmy"]},
{"name":"batch", "literal":"October"}
],
"output_delimiter": ",",
"spreadsheet_safe": false
}
}Every output column chooses exactly one source, literal, or concat (a list of source columns, joined by separator). Sources always refer to original headers. Columns appear in the order supplied; unreferenced inputs are listed in omitted_columns. Every input row remains.
Actions run in order: trim, lowercase, uppercase, decimal_comma, date_dmy, date_mdy. Decimal-comma conversion requires a plain signed or unsigned number with a comma fraction and no grouping. Dates require exactly DD/MM/YYYY or MM/DD/YYYY respectively, with a real calendar date. Any failed conversion blocks the entire output: valid:false and csv_text:null. No arithmetic or arbitrary code is supported.
Reconciliation rules
Download a complete example request. Supply left, right, and recipe. The recipe has version:1, keys:[{"left":"id","right":"customer_id"}], an explicit mode, and output columns with name, side and column.
- Keys compare exact strings, without trimming, case changes or numeric coercion. Composite keys use separate components. Empty or duplicate keys on either side block the entire join, including many-to-many cases. Fix them explicitly first.
leftkeeps every left record;innerkeeps matches;fullalso appends unmatched right records. Unmatched records are reported even if excluded from output. Within each side, original ordering is preserved.- Optional
compare:[{"left":"amount","right":"amount"}]flags unequal paired values asvalue_changedwarnings. Differences do not establish which side is correct. lineagemaps each output record to original left/right data records. Missing-side fields are empty strings; a null lineage pointer distinguishes a missing row from an empty input cell.- Formula-like output cells/headers are warnings.
spreadsheet_safe:trueexplicitly prefixes them with an apostrophe; review the changed values and headers before importing. - Table reports include complete findings, unlike the legacy validator's 200-detail cap. If findings or output would exceed limits, the request fails uncharged and asks you to split it. Browser tables preview 100 findings; downloaded JSON contains all of them.
Limits and retries
The existing 1 MB / 10,000-record / 250,000-cell budget applies to the combined inputs of a join. Up to 100 columns and 10,000 characters per cell. Output CSV has the same limits. Complete JSON reports are limited to 4 MB with a 2 MB findings budget; HTTP request bodies remain limited to 2 MB. Input structures, limits and unknown column references fail uncharged. Completed reports with duplicate-key or conversion findings are charged. Old CSV operations and their retry fingerprints are unchanged.
Use Idempotency-Key for REST or request_id for MCP. Reuse it only for identical inputs and the same operation. Keep a stable ID for retries of one workflow run; use a new ID for a new run or changed input. Recipes are returned for reuse but are not stored by Orvel.
Use in Make
- Keep file retrieval in your existing scenario. Decode CSV as UTF-8; do not send file URLs to this service.
- Add HTTP → Make a request, method POST, URL
https://check.orvel.dev/v1/tables/reconcile. Add your paid key through Make's secure credential/header configuration asAuthorization: Bearer YOUR_KEY. - Select an application/json body and use a data structure to map
left.csv_text,right.csv_textand the recipe from the example. Do not interpolate raw CSV into a hand-written JSON string: quotes and newlines need JSON escaping. - Set an
Idempotency-Keystable for that input/run, then parse the response. A 200 response can containvalid:false. - Only send
csv_textonward whenvalidis true and you have reviewed the warnings. Route errors and unmatched/changed findings for review. Keep destination writes in your scenario.
This is HTTP setup guidance based on the Make HTTP documentation, not an imported or live-tested Make blueprint. Native joins and transformations may already be sufficient; compare this operation with your current workflow before buying further credit.
REST quick start
GET /v1/example returns a complete request body. Save it as input.json, then:
curl https://check.orvel.dev/v1/validate \ -H "Authorization: Bearer $IMPORT_CHECK_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: customer-import-0001" \ --data-binary @input.json
POST /v1/clean adds a cleanup object. GET /v1/usage returns your balance. GET /v1/demo runs the fixed free sample. The full machine-readable contract is at /openapi.json.
Schema and format rules
{
"csv_text": "id,amount,joined\nA1,12.50,2026-09-01\n",
"delimiter": ",",
"schema": {
"columns": [
{"name":"id", "type":"string", "required":true, "unique":true},
{"name":"amount", "type":"decimal", "minimum":"0", "maximum":"9999"},
{"name":"joined", "type":"date"}
],
"allow_extra_columns": false
}
}- Headers match exactly and are case-sensitive. Duplicate or empty headers are rejected. A UTF-8 BOM is accepted.
- Every schema column must exist.
required:falseallows empty cells, not absent headers. Whitespace is not silently trimmed. unique:truecompares exact non-empty strings.01and1differ. Uniqueness is only within this file.- Types: string, integer, decimal, boolean, date, email. Integers and decimals use ASCII digits, optional sign, and a decimal dot; no grouping or exponents. Boolean values are exactly
trueorfalse. Dates are valid calendar dates inYYYY-MM-DD. - Email checks are basic syntax checks; no mailbox existence, deliverability or exhaustive RFC validation.
choicesis an exact string allowlist. Numeric minimum/maximum are inclusive decimal strings.max_lengthlimits characters.- Extra columns are errors unless allowed; extra columns are still preserved and checked for formula markers.
- Empty physical lines are skipped. Findings use 1-based data record numbers, excluding the header. Multiline quoted cells do not change record numbering.
- All issue counts are returned, with at most 200 detailed findings.
issues_truncatedmakes truncation explicit. A valid report may still contain warnings.
Explicit cleanup
"cleanup": {
"rename": {"Email Address":"email"},
"changes": [{"column":"Email Address", "action":"trim"}],
"spreadsheet_safe": false
}Allowed actions: trim, lowercase, uppercase, decimal_comma. They run in listed order on original header names. Renames are simultaneous, and the schema describes the renamed output. Decimal-comma conversion changes 12,50 into 12.50; it leaves grouping or ambiguous formats untouched. No rows are removed and no formulas are evaluated.
spreadsheet_safe:true prefixes formula-like data cells and headers with an apostrophe. Header escaping changes the output header name, which must match the supplied output schema. This changes the cell value and may cause numeric validation failures for negative numbers. The returned report validates the actual transformed values. This option is designed for spreadsheet export; review it before importing into another system. The service warns about formula-like cells even when escaping is disabled.
Limits, billing and retries
Maximum input: 1,000,000 UTF-8 bytes, 10,000 records, 100 columns, 250,000 cells, 10,000 characters per cell. HTTP JSON body limit: 2 MB. Delimiters: comma, semicolon, tab or pipe. Split larger files; v0.1 has no background jobs or file storage.
€9 buys 100 operations valid for 90 days from settled payment. Each completed validation or cleanup report costs one operation, including valid:false. Malformed CSV, invalid schemas, and service failures do not return a paid report. The free demo cannot process custom data. Refunds and disputes revoke access; retrieving a key never refills it.
For REST retries use Idempotency-Key; for MCP use request_id. Allowed format: 8–128 ASCII letters, digits, underscores, dots, colons or hyphens. Identical input, operation and request ID consume only once for that purchase. Reusing an ID for changed input is rejected. Without an ID every completed call consumes an operation. Generate a new ID when updating inputs or after an engine version change.
REST errors: 401 invalid/inactive key, 402 exhausted pack, 409 conflicting retry, 422 invalid input, 429 rate limit, 503 unavailable. MCP business errors are tool errors with actionable messages. Retry temporary failures with the same ID. JSON-RPC batches are not supported.
Data boundaries
The service never downloads URLs, executes formulas, writes to a destination database or sends data to an LLM. It validates only the supplied rules, not accounting correctness, identity, or compatibility with an external importer. Treat cell content and headers as untrusted data in your agent's workflow.
Contact Orvel for activation or key recovery. Keep your payment receipt; never email CSV contents or your API key.