Docs · Validators
email validator
Lenient `local@host.tld` shape check. No DNS, no SMTP.
Reference
Format
Matches `/^[^\s@]+@[^\s@]+\.[^\s@]+$/`. Anything with a non-empty local part, an `@`, a non-empty domain, a `.`, and a non-empty TLD passes.
Examples
- alice@example.com
- a+b@sub.example.co.uk
- invalid: alice@@example.com (double @ caught)
How it runs
Implementation
A faithful summary of lib/validators.ts. Validators are pure functions and run identically in the Worker, the Workbench and the MCP server — one implementation, so the three cannot disagree about whether a value is valid.
function validEmail(value) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)
? OK
: fail('email_invalid', 'not a valid email')
}Config
Use in a template
Validators attach to a field on a custom template. The cascade runs them after mapping but before commit; failures surface in the per-row validation report.
fields:
- column: email
type: email
validators:
- type: emailWatch out
Common gotchas
- Shape check only. We do NOT verify MX records, do not call SMTP, and do not implement RFC 5322. `foo@bar.baz` passes even if the domain has no mailbox.
- Quoted local parts (`"a b"@example.com`) and IP-literal domains (`alice@[127.0.0.1]`) are rejected.
- Internationalised emails (Unicode local part / IDN domain) currently pass via the loose pattern — but downstream FHIR `ContactPoint.value` will reject non-ASCII.
Where it runs
Three routes, no AI cost.
- POST
/v1/validate-rowValidate one row against a template. Stateless, no key, pure compute — the fastest way to try email against a real value.no key - POST
/v1/uploads/:id/validateRun every field validator over the parsed upload, without committing. Returns errors and warnings per row.read - POST
/v1/uploads/:id/commitValidates on the way out.skip_invalid_rowsdrops the failures instead of failing the commit.commit
Validators are pure functions, so they add nothing to the AI bill. Every map draws a small flat per-map fee from your prepaid token wallet ($10 minimum, shared across the phi-cloud suite); only columns that reach the metered LLM layer, plus any-to-any convert and structural reshape, bill real AI tokens. See pricing
Catalogue
Related templates
- Users
users_v1User directory: identity, contact, role, and onboarding metadata.
Fields ·
email - Patient demographics
patient_demographics_v1Patient identity. Emits FHIR Patient.
Fields ·
email - Leads
leads_v1Sales leads: contact, source, status, and creation metadata.
Fields ·
email - Contacts
contacts_v1People at named accounts: identity, contact details, role, decision-maker flag.
Fields ·
email - Opportunities
opportunities_v1Deals in pipeline: amount, stage, probability, close date, owner.
Fields ·
owner_email - Customers
customers_v1Repeat e-commerce buyers: identity, contact, default shipping, lifetime stats.
Fields ·
email - Employees
employees_v1Employee master records with identity, contact, and bank details. Contains PII.
Fields ·
email - Candidates
candidates_v1Recruiting pipeline: applicant contact, role, and stage.
Fields ·
email
Explore
All 19 validator types
The complete list a template field can declare. There is no SNOMED validator — it required an affiliate licence, no template used it, and it was removed in 2026.
- regex
- enum
- date_range
- number_range
- phone
- url
- iban
- bic
- uuid
- gtin
- pharmacode
- fhir_reference
- loinc_code
- icd10_code
- atc_code
- cpt_code
- npi
- gln
Back to the documentation index or browse the template catalogue.
Ready when you are
Validate every row — before it lands.
Attach checksum-strict validators to any field, and gate risky commits behind the requires_hitl flag. One key runs the whole cascade.