vCard Validator

Paste a vCard (.vcf) to check it against the 2.1, 3.0 and 4.0 specifications. Reports missing required properties, malformed phone numbers and email addresses, bad dates, broken structure and parameter mistakes — each with a card number, a line number, a severity and a rule name. Get a readable report or JSON for CI. Runs entirely in your browser; nothing is uploaded.

Try:
Validation result

About the vCard validator

This tool checks a vCard (.vcf) file against the specification and reports every problem it finds — it never rewrites your file. Paste the card text into the vCard / .vcf text box and it unfolds continuation lines, splits the document into individual cards, and reports each issue with a card number, a line number, a severity (error or warning) and a stable rule name. Everything runs locally in your browser; nothing is uploaded.

It understands vCard 2.1, 3.0 (RFC 2426) and 4.0 (RFC 6350). By default each card is checked against its own VERSION; pick a specific version under Check against to validate a whole file against one spec and flag any card that declares something else.

What it checks

Turn off Check EMAIL address syntax or Check TEL phone-number validity to silence those rule groups. Choose Report for a readable list or JSON for a structured {ok, cards, error_count, warning_count, versions, issues[]} object you can pipe into CI.

Worked example

Given this card:

BEGIN:VCARD
VERSION:3.0
FN:Ada Lovelace
N:Lovelace;Ada
EMAIL:ada@@example.com
TEL;WORK:+44 1632 960 961
BDAY:1815-13-40
URL:example.com
END:VCARD

the report opens with INVALID — 1 card, 4 errors, 2 warnings and then lists, in line order: the bare parameter WORK on the TEL line (an error in 3.0 — write it as TYPE=WORK), the invalid email ada@@example.com (it has more than one @), the invalid N on line 4 (only 2 of the required 5 components), the invalid date 1815-13-40 (month 13, day 40), the non-absolute URI example.com (a warning — it needs a scheme such as https://), plus a document-level LF line endings warning. The phone number +44 1632 960 961 passes, because it is a valid UK number in international format.

Switching Output to JSON returns the same findings as an issues[] array with "ok": false, each entry carrying card, line, severity, rule, property and message.

Limits & edge cases

FAQ

Does this upload or store my contacts?

No. The validator is compiled to WebAssembly and runs entirely in your browser — your vCard text never leaves the page and nothing is sent to a server. You can safely paste a real address book; the tool only reads it to report issues, and it never rewrites or transmits anything.

Why is my phone number reported as unverifiable instead of invalid?

A number written in national format(650) 253-0000, 020 7946 0958 — is meaningless without knowing which country it belongs to, so the tool will not guess. Enter the country in Default country for phone numbers as an ISO-3166 alpha-2 code (US, GB, DE, …) and the number is then checked properly. A number written in international format (+16502530000) needs no hint. Once a country is known, a number that cannot exist for it — a bogus (555) 000-0000, say — is reported as a real invalid-tel error.

What's the difference between an error and a warning?

Errors are things that make the card invalid or that a parser will get wrong: broken BEGIN/END structure, a missing VERSION/FN/N, a line with no :, a malformed email address or phone number, a bad date, N or ADR with the wrong number of components, and a single-instance property used twice. Warnings are things that parse but hurt interoperability: lines longer than 75 octets, LF-only line endings, properties not defined by any vCard version, empty values, a TEL that is not a tel: URI in 4.0, and unquoted parameter values. In JSON output, ok is true only when the error count is zero.

Why is `TEL;WORK:` an error on my card?

The bare, value-only parameter form (TEL;WORK;VOICE:…) belongs to vCard 2.1 only. vCard 3.0 and 4.0 require named parameters, so the same line must be written TEL;TYPE=WORK:…. If your file really is a 2.1 export, either leave Check against on Auto with a VERSION:2.1 line in the card, or select vCard 2.1 explicitly — the rule then goes quiet.

Can I use this in CI or a script?

Yes. Set Output to JSON and you get {ok, cards, error_count, warning_count, versions, issues[]}, where every issue carries a stable rule slug (missing-fn, invalid-tel, duplicate-property, …) so you can filter or fail a build on specific rules. The same validator is available from the command line with the same parameter names — the CLI example above this section is copy-paste runnable.

Which vCard versions are supported?

2.1, 3.0 (RFC 2426) and 4.0 (RFC 6350). Auto mode reads each card's own VERSION property, so a file mixing versions is handled card by card. Choosing a specific version instead checks everything against that spec and raises a version-mismatch error for any card declaring a different one — useful when you are migrating an address book and want to know exactly what breaks.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool vcard-validator "BEGIN:VCARD
VERSION:3.0
FN:Ada Lovelace
N:Lovelace;Ada
EMAIL:ada@@example.com
TEL;WORK:+44 1632 960 961
BDAY:1815-13-40
URL:example.com
END:VCARD"

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/vcard-validator/?data=BEGIN%3AVCARD%0AVERSION%3A3.0%0AFN%3AAda%20Lovelace%0AN%3ALovelace%3BAda%0AEMAIL%3Aada%40%40example.com%0ATEL%3BWORK%3A%2B44%201632%20960%20961%0ABDAY%3A1815-13-40%0AURL%3Aexample.com%0AEND%3AVCARD&version=auto&default_country=US&check_email=true&check_phone=true&required_properties=UID%2CORG&output=report

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.