Healthcare
6NPI, NPPES status, taxonomy codes, DEA shape, specialty coherence.
CureData catches the errors spreadsheets hide. Upload a file, compose a ruleset from dozens of primitives, and get a precise, auditable report of what's wrong — and where.
Drop in a CSV, XLSX, or JSON. We sniff headers, sample a few rows, and infer types so you have a starting point — not a blank slate.
Try the uploaderRequired, type, length, range, enum, regex, date order, cross-field logic — and a slot for custom TypeScript when the spec gets weird.
See the primitivesKPIs, column profiles, and a CSV of issues keyed by row. Rerun with the same ruleset against next week's file. Deterministic output.
Export formatEvery primitive in CureData is small, named, and explainable. Packs group them by domain so you don't rebuild the wheel for every vendor file that lands on your desk.
Browse all packsNPI, NPPES status, taxonomy codes, DEA shape, specialty coherence.
Email shape, MX lookup, E.164 phone, name heuristics, DOB bounds, UUID/ULID.
Postal formats, ISO-3166, state coherence, lat/lon bounds.
Luhn, IBAN, SWIFT/BIC, ISO-4217 currency, precision and scale, tax-id lengths.
Required, enum, regex, min/max, ISO-8601 dates, uniqueness, referential.
"If A then B", conditional ranges, temporal ordering, dependency graphs.
CureData's schemas are JSON first, TypeScript when you need to reach further. Version them with your code, diff them in review, and send a failure report back to the team that produced the file.
{
"entity": "Orders",
"columns": {
"orderId": ["required", "uuid_v4"],
"email": ["required", "email_pattern"],
"currency": ["iso4217"],
"amount": ["number", "precision:2", "min:0"],
"createdAt": ["date_iso"],
"shipTo.country": ["iso3166_alpha2"],
"shipTo.postal": ["postal_by_country:shipTo.country"]
},
"policy": { "fail": "any" }
}export default function postalByCountry({ get, add }: any) {
const c = String(get('shipTo.country') || '').toUpperCase()
const p = String(get('shipTo.postal') || '')
const MAP: Record<string, RegExp> = {
US: /^[0-9]{5}(-[0-9]{4})?$/,
CA: /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/,
GB: /^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$/i
}
const re = MAP[c]
if (re && !re.test(p)) add('postal.pattern', `Postal does not match ${c}`)
}No sign-up to try it. Sign in only when you want to save a ruleset.