{
  "slug": "vcard-validator",
  "name": "gizza-ai/vcard-validator",
  "version": "0.1.0",
  "title": "vCard Validator — Check .vcf Files for Bad Phones, Emails & Missing Fields — gizza.ai",
  "description": "Paste a vCard to validate it against the 2.1, 3.0 and 4.0 specs: missing FN/N/VERSION, malformed phone numbers and emails, bad dates and structure. Runs in your browser.",
  "tags": [
    "vcard validator",
    "vcf validator",
    "vcard checker",
    "rfc 6350",
    "rfc 2426",
    "vcard 4.0",
    "contact file lint",
    "vcf syntax check"
  ],
  "category": "data",
  "urls": {
    "page": "https://gizza.ai/tools/vcard-validator/",
    "markdown": "https://gizza.ai/tools/vcard-validator/index.md",
    "descriptor": "https://gizza.ai/tools/vcard-validator/tool.json",
    "deep_link_example": "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"
  },
  "cli": "gizza tool vcard-validator \"BEGIN:VCARD\nVERSION:3.0\nFN:Ada Lovelace\nN:Lovelace;Ada\nEMAIL:ada@@example.com\nTEL;WORK:+44 1632 960 961\nBDAY:1815-13-40\nURL:example.com\nEND:VCARD\"",
  "tool": {
    "description": "Validate a vCard/.vcf address book against the specification and report every problem without rewriting the file. Pass the card text in `data`; the tool unfolds continuation lines, splits the document into cards, and checks: structure (BEGIN/END pairing, content outside a card, stray fold lines, over-long unfolded lines, LF-only line endings), VERSION (present, known, first property in 4.0, matching an explicitly requested version), required properties (FN in 3.0/4.0, N in 2.1/3.0, plus anything named in required_properties), line syntax (missing ':', property-name charset, group prefixes, empty or bare parameters — bare parameters are legal in 2.1 only — unquoted parameter values, a 2.1-only CHARSET parameter), values (EMAIL address syntax, TEL phone-number validity via libphonenumber with an optional default_country hint, BDAY/ANNIVERSARY dates including vCard 4.0 partial dates, REV timestamps, absolute URIs for URL/SOURCE/FBURL/CALURI, exactly 5 components in N and 7 in ADR, KIND and GENDER enums in 4.0) and hygiene (single-instance properties appearing twice, non-standard properties without an X- prefix, empty values). Every issue carries a card number, a 1-indexed source line, a severity (error/warning) and a stable rule name. Turn off check_email or check_phone to silence those rule groups. `output` selects 'report' (default, human-readable) or 'json' (structured, for CI). Returns an error when the input contains no vCard at all.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "check_email": {
          "default": true,
          "description": "Check EMAIL values for valid address syntax (single '@', non-empty local part, dotted domain with valid labels). Default true; set false to skip the EMAIL rules.",
          "type": "boolean"
        },
        "check_phone": {
          "default": true,
          "description": "Check TEL values as real phone numbers (libphonenumber rules, honouring default_country and stripping a leading 'tel:'). Default true; set false to skip the TEL rules.",
          "type": "boolean"
        },
        "data": {
          "description": "Raw vCard / .vcf text containing one or more BEGIN:VCARD ... END:VCARD blocks. Folded (continuation) lines are unfolded first, and every issue is reported against its original line number. The text is only read, never rewritten.",
          "type": "string"
        },
        "default_country": {
          "default": "",
          "description": "Optional ISO-3166 alpha-2 country/region hint (for example US, GB, DE) used to check TEL values written without a '+'. Leave blank to report national-format numbers as unverifiable instead of invalid.",
          "type": "string"
        },
        "output": {
          "default": "report",
          "description": "Output form: 'report' (default) a readable per-card list of issues with line numbers, severities and rule names, or 'json' a structured {ok, cards, error_count, warning_count, versions, issues[]} object for CI.",
          "enum": [
            "report",
            "json"
          ],
          "type": "string"
        },
        "required_properties": {
          "default": "",
          "description": "Extra comma-separated property names that every card must carry, on top of the version's own requirements — for example 'UID,ORG' for a CardDAV-style profile. Matched case-insensitively. Default none.",
          "type": "string"
        },
        "version": {
          "default": "auto",
          "description": "Which vCard specification to check against. 'auto' (default) uses each card's own VERSION property (a card with no VERSION is checked as 3.0). Pick 2.1, 3.0 or 4.0 to check every card against that spec and flag any card declaring a different VERSION.",
          "enum": [
            "auto",
            "2.1",
            "3.0",
            "4.0"
          ],
          "type": "string"
        }
      },
      "required": [
        "data"
      ],
      "type": "object"
    }
  }
}