CureData Documentation

Define, automate, and enforce business-grade data validations — all in a single page app.

Getting started

Upload CSV or XLSX (most common), or JSON. We auto-detect headers and sample five rows. You can also start with a blank schema.

Sample input
Email,Amount,StartDate,EndDate,State
alice@example.com,12.50,2024-01-10,2024-01-12,CA
bob@example.com,0,2024-02-01,2024-02-01,WA
,19.99,2024-03-05,2024-03-06,TX
Tips & behavior
  • Header row required (first line).
  • Delimiter auto-detects (, default). Supports quotes and newlines in fields.
  • Dates: prefer ISO (YYYY-MM-DD).
  • Numbers: plain decimal (no currency symbols).
  • Saved rulesets map to headers using a strategy: EXACT / CI / FUZZY.
Pro tip: Upload first, then click “Use Detected Headers” to build a starter schema.

Schemas & columns

A schema is a named collection of columns. Each column carries 0..n rules. Order doesn’t matter — rules are evaluated in an optimized pass.

Column config
{
  name: "StartDate",
  rules: [
    { type: "type", expected: "date" },
    { type: "noFutureDate" }
  ]
}
Cross-field logic
{
  name: "EndDate",
  rules: [
    { type: "type", expected: "date" },
    { type: "dateOrder", otherField: "StartDate", op: ">=" }
  ]
}

Header matching strategy

When you apply a saved ruleset to a new upload, we need to match your file’s headers to the ruleset’s column keys. The header_match_strategy controls how strictly we match names.

StrategyMatch ruleExampleWhen to use
EXACTNames must match exactlyruleset key NPI ⇄ header NPIStrict internal feeds with stable headers
CICase-insensitive matchruleset key NPI ⇄ header npi, NpiVendors who vary capitalization only
FUZZYLoose/approximate name matchruleset key ProviderNPI ⇄ header NPI NumberExternal files with inconsistent naming
Tip: If your uploads already match your ruleset keys, use EXACT. If only capitalization varies, use CI. Otherwise choose FUZZY.

Rule Packs (one-click presets)

Email (basic)
Best for: Contact emails
requiredtype:stringemail
US Phone
Best for: US phone numbers
type:stringphoneUS
US Address Lite
Best for: Ship address
stateCodeUSzipUS
Money
Best for: Prices, totals
type:numberrange≥0precision:2

Walkthrough: Sample Orders

  1. orderIdrequired, type:string, length 8–36, unique_in_file
  2. emailrequired, type:string, email
  3. phonetype:string, phoneUS
  4. amounttype:number, range ≥ 0, precision 2
  5. order_datetype:date, noFutureDate
  6. ship_datetype:date, dateOrder: ship_date ≥ order_date
  7. statusenum [Pending, Processing, Shipped, Delivered, Cancelled]
  8. ifThen → If status="Cancelled" then ship_date blank
  9. state / zipstateCodeUS, zipUS

Rules reference

Core rules ship built-in. Add as many as needed per column. regex/enum can repeat. Note: Cross-field rules like dateOrder and ifThen reference other columns.

RuleWhat it checksParametersExpected valueGood exampleBad example
required Field cannot be blank or missing.Value is present (not empty, not null).any"ORD-123"(empty)
type:string Force the value to be text.Value parses as a string.expected = stringtext"hello"42 (number)
type:number Force the value to be numeric.Value parses as a number.expected = numbernumber19.99"N/A"
type:date Force the value to be a valid date.Value parses as a date.expected = datedate2024-05-01"not-a-date"
type:boolean Force the value to be yes/no.Value is boolean-ish (true/false, yes/no).expected = booleanbooleantrue"maybe"
length Restrict minimum / maximum characters.Text length is within bounds.min, maxtextorderId length 12orderId length 2
enum Only allow these values.Value is one of the provided list.values: [Pending, Processing, Shipped, Delivered, Cancelled]text (categorical)"Shipped""Unknown"
regex Advanced pattern rule.Value matches a regular expression.pattern, flags, nametext"ORD-202501-0042""ORD-Jan-42"
range Limit number to a range.Number is ≥ min and ≤ max (inclusive by default).min, max, inclusive=truenumber0 ≤ amount ≤ 100000-4
precision Limit digits after the decimal.Number has at most N decimals.scale: 2number19.9919.9999
dateOrder Ensure dates are in logical order.This date compares correctly to another column.otherField, op: >, ≥, =, ≤, <dateship_date ≥ order_dateship_date 2025-01-01 < order_date 2025-02-01
noFutureDate Date must be today or earlier.Date is ≤ today.dateyesterdaynext week
notExpired Date must be today or later.Date is ≥ today.datenext monthlast year
ifThen Apply rules conditionally.IF condition is true THEN target must satisfy requirement.if:{field, op, value} → then:{field, mustBe/op}variesIF status=Cancelled THEN ship_date blankCancelled with ship_date present
email Must look like name@example.com.Basic email shape.text"user@example.com""name@@example"
phoneUS Valid 10-digit US phone.Accepts common US formats with 10 digits.text"(415) 555-0123""555-12-1234"
stateCodeUS Two-letter US state like CA, TX.Matches official 2-letter postal code.text"CA""California"
zipUS 5-digit or ZIP+4.##### or #####-####text"94107-1234""9410A"
Luhn Checksum validation (Luhn).Passes Luhn checksum (often 10+ digits).text/number"79927398713""79927398710"
19 / 19 rules shown

Operators & Glossary

Comparison operators
  • == / = equal to
  • != not equal
  • >, ≥, ≤, < greater/less (dates and numbers)
  • exists value present (not empty)
  • blank value must be empty
Field types
  • string any text; length/regex/enum apply
  • number decimal; range/precision apply
  • date ISO recommended (YYYY-MM-DD)
  • boolean true/false (1/0, yes/no accepted)

Validation context & phases

Phase 1 runs client-only with local rules. A lightweight ctx object provides things like now.

Context object
const ctx = { now: new Date() }

Exporting results

The demo exports a CSV of issues. Columns: rowIndex, column, code, message, value.

CSV example
rowIndex,column,code,message,value
12,Email,required,"Value is required",""
42,Amount,range,"Must be between 0 and 1000","-12"

FAQ & Troubleshooting

Can I add multiple regex/enums on a column?
Yes. regex and enum are repeatable.
Is column order important?
No. Evaluation is optimized independent of order.
Cross-row validations?
Use unique_in_file today; more dataset-level rules land via packs.
Build error: “[vue/compiler-sfc] Unexpected token, expected ‘,’”
This page avoids JSX/TSX entirely (pure templates + computed), so it should compile cleanly under Nuxt 4 + Vite.