This page follows RFC 6350 (vCard 4.0) sections 3 to 6 with its ABNF, and the extension RFCs named in each section, all read 2026-11-13. The properties page gives the meaning of each property.
Content lines
contentline = [group "."] name *(";" param) ":" value CRLF
group = 1*(ALPHA / DIGIT / "-")
param-value = *SAFE-CHAR / DQUOTE *QSAFE-CHAR DQUOTE
any-param = (iana-token / x-name) "=" param-value *("," param-value)
x-name = "x-" 1*(ALPHA / DIGIT / "-")
- Folding. A line that begins with white space continues the previous one; the CRLF and that one white space character are removed (unlike RFC 5322, the sequence is removed anywhere). Lines longer than 75 characters should be folded.
- Case. Group, property and parameter names are case-insensitive (write them upper-case). A parameter value is case-insensitive unless its definition says otherwise.
- Quoting. A parameter value that contains a colon, semicolon or comma is put in double quotes (the quotes are not part of the value); an unquoted value may not contain control characters,
",;or:(SAFE-CHAR); a quoted one may not contain"or controls (QSAFE-CHAR). - Groups only say that properties with the same prefix belong together; a reader that ignores them can strip the prefix.
- Cardinality:
1exactly one must be present;*1at most one;1*one or more;*any number. A property with several values is normally written as several lines; only some value types (dates, times, integers, floats, text lists) allow comma lists on one line. - Escaping. A comma in a value is always escaped as
\,(even where lists are not allowed). A semicolon is escaped as\;in fields of compound properties (N,ADR,ORG,GENDER) and may be elsewhere. A backslash is\\; a line break is\nor\N. No other escapes are allowed. A compound property that may occur several times must not be put on one line. - Media type
text/vcard, with an optionalversionparameter that must equal theVERSIONof every card in the body; only UTF-8 is allowed as charset.
Value types
text = *TEXT-CHAR ; backslash, comma and newline must be escaped
component = text without ";" unescaped ; a field of a structured value
list-component = component *("," component)
boolean = "TRUE" / "FALSE" ; case-insensitive
integer = [sign] 1*DIGIT ; 64-bit signed range
float = [sign] 1*DIGIT ["." 1*DIGIT] ; no exponent; binary64 precision at least
utc-offset = sign hour [minute] ; +hhmm basic format, hour 00-23, minute 00-59
date = year [month day] / year "-" month / "--" month [day] / "--" "-" day
date-noreduc = year month day / "--" month day / "--" "-" day
time = hour [minute [second]] [zone] / "-" minute [second] [zone] / "-" "-" second [zone]
date-time = date-noreduc "T" time-notrunc
timestamp = date-complete "T" time-complete ; no truncation
date-and-or-time = date-time / date / "T" time
zone = "Z" / utc-offset
The same value type names appear in the VALUE parameter (text, uri, date, time,
date-time, date-and-or-time, timestamp, boolean, integer, float,
utc-offset, language-tag). Dates, times and date-times use ISO 8601 basic format, with truncation allowed in the
forms above: 19961022T140000, --1022T1400, ---22T14, 19850412, 1985-04,
1985, --0412, ---12, T102200Z, T-2200, T--00; a stand-alone time in
date-and-or-time always has a leading T. Timestamps: 19961022T140000Z, 19961022T140000-0500.
A URI value stands for what the URI points to (a data: URI embeds the data). A Language-Tag follows RFC 5646.
Value syntax and parameters, property by property
From the ABNF of RFC 6350 section 6. Every property except BEGIN, END, XML and CLIENTPIDMAP also takes
any extension parameter (any-param); CLIENTPIDMAP takes only those. VALUE is allowed
only with the value type(s) shown. ALTID, PID, PREF, TYPE, LANGUAGE, MEDIATYPE
have the meaning of the parameters table.
| Property | Cardinality | Value syntax | Parameters allowed |
|---|---|---|---|
BEGIN, END | 1 | VCARD | none |
VERSION | 1 | 4.0 | VALUE=text |
SOURCE | * | URI | VALUE=uri, PID, PREF, ALTID, MEDIATYPE |
KIND | *1 | individual / group / org / location / iana-token / x-name | VALUE=text |
XML | * | text (xCard elements) | VALUE=text, ALTID (no extension parameters) |
FN | 1* | text | VALUE=text, TYPE, LANGUAGE, ALTID, PID, PREF |
N | *1 | 5 list-components separated by ;: family, given, additional, prefixes, suffixes (RFC 9554: 7, see below) | VALUE=text, SORT-AS, LANGUAGE, ALTID |
NICKNAME | * | text list | VALUE=text, TYPE, LANGUAGE, ALTID, PID, PREF |
PHOTO, LOGO, SOUND | * | URI | VALUE=uri, ALTID, TYPE, MEDIATYPE, PREF, PID (LOGO and SOUND also LANGUAGE) |
BDAY | *1 | date-and-or-time, or text | VALUE=date-and-or-time with CALSCALE; or VALUE=text with LANGUAGE; ALTID |
ANNIVERSARY | *1 | date-and-or-time, or text | VALUE=date-and-or-time or text; ALTID, CALSCALE |
GENDER | *1 | sex [";" text], sex = empty / M / F / O / N / U | VALUE=text |
ADR | * | 7 list-components: post office box; extended address; street; locality; region; postal code; country (RFC 9554: 18) | VALUE=text, LABEL, LANGUAGE, GEO, TZ, ALTID, PID, PREF, TYPE |
TEL | * | text, or URI (VALUE=uri) | VALUE=text or VALUE=uri (with MEDIATYPE); TYPE (text, voice, fax, cell, video, pager, textphone and work/home), PID, PREF, ALTID |
EMAIL | * | text | VALUE=text, PID, PREF, TYPE, ALTID |
IMPP | * | URI | VALUE=uri, PID, PREF, TYPE, MEDIATYPE, ALTID |
LANG | * | Language-Tag | VALUE=language-tag, PID, PREF, ALTID, TYPE |
TZ | * | text, URI or utc-offset | VALUE=text, uri or utc-offset; ALTID, PID, PREF, TYPE, MEDIATYPE |
GEO | * | URI | VALUE=uri, PID, PREF, TYPE, MEDIATYPE, ALTID |
TITLE, ROLE | * | text | VALUE=text, LANGUAGE, PID, PREF, ALTID, TYPE |
ORG | * | components separated by ;: organisation name, then units | VALUE=text, SORT-AS, LANGUAGE, PID, PREF, ALTID, TYPE |
MEMBER | * | URI | VALUE=uri, PID, PREF, ALTID, MEDIATYPE |
RELATED | * | URI or text | VALUE=uri with MEDIATYPE, or VALUE=text with LANGUAGE; PID, PREF, ALTID, TYPE (work, home and the relation words) |
CATEGORIES | * | text list | VALUE=text, PID, PREF, TYPE, ALTID |
NOTE | * | text | VALUE=text, LANGUAGE, PID, PREF, TYPE, ALTID |
PRODID | *1 | text | VALUE=text |
REV | *1 | timestamp | VALUE=timestamp |
UID | *1 | URI or text | VALUE=uri or VALUE=text |
CLIENTPIDMAP | * | 1*DIGIT ";" URI | extension parameters only |
URL, FBURL, CALADRURI, CALURI | * | URI | VALUE=uri, PID, PREF, TYPE, MEDIATYPE, ALTID |
KEY | * | URI or text | VALUE=uri with MEDIATYPE, or VALUE=text; ALTID, PID, PREF, TYPE |
Parameter value syntax: LANGUAGE= Language-Tag; VALUE= value type; PREF= 1 or 2 digits or 100;
ALTID= any param-value (properties with the same ALTID and name count as one for cardinality); PID= one or more
1*DIGIT ["." 1*DIGIT] values separated by commas; TYPE= a comma list of type values;
MEDIATYPE= a media type; CALSCALE=gregorian; SORT-AS= sort keys; LABEL= param-value;
GEO= and TZ= as for the properties. The TYPE values work and home are allowed on
FN, NICKNAME, PHOTO, ADR, TEL, EMAIL, IMPP, LANG,
TZ, GEO, TITLE, ROLE, LOGO, ORG, RELATED, CATEGORIES,
NOTE, SOUND, URL, KEY, FBURL, CALADRURI and CALURI.
Registered extensions
IANA's vCard Elements registry (last updated 2026-01-13, read 2026-11-13) lists these beyond RFC 6350: properties BIRTHPLACE,
DEATHPLACE, DEATHDATE (RFC 6474), EXPERTISE, HOBBY, INTEREST, ORG-DIRECTORY (RFC 6715),
CONTACT-URI (RFC 8605), CREATED, GRAMGENDER, LANGUAGE, PRONOUNS, SOCIALPROFILE
(RFC 9554), JSPROP (RFC 9555); parameters INDEX, LEVEL (RFC 6715), GROUP (RFC 7095), CC
(RFC 8605), AUTHOR, AUTHOR-NAME, CREATED, DERIVED, LABEL, PHONETIC, PROP-ID,
SCRIPT, SERVICE-TYPE, USERNAME (RFC 9554), JSPTR, JSCOMPS (RFC 9555); the value data type
UNKNOWN (RFC 7095); property values KIND application (RFC 6473) and device (RFC 6869), and the
GRAMGENDER values below; parameter values TYPE=main-number on TEL (RFC 7852), LEVEL, TYPE=billing
and delivery on ADR, and PHONETIC values. RFC 6473, 6869 and 8605 are on the
properties page.
Birth and death (RFC 6474)
BIRTHPLACEandDEATHPLACE: at most one each; a single text (default) or a single URI (VALUE=textorVALUE=uri, which must match the value); parameters VALUE, LANGUAGE, ALTID. Examples:BIRTHPLACE:Babies'R'Us Hospital,BIRTHPLACE;VALUE=uri:geo:46.769307,-71.283079.DEATHDATE: at most one; date-and-or-time (default) or text; parameters VALUE, CALSCALE (only with a date or date-time), LANGUAGE (only with text), ALTID. Its presence says the subject is known to be dead; its absence says nothing. Examples:DEATHDATE:19960415,DEATHDATE:--0415,DEATHDATE;VALUE=text:circa 1800.
Expertise, hobbies and interests (RFC 6715)
EXPERTISE,HOBBY,INTEREST: any number; one free-form text value each, meant for people (no vocabulary is defined); parameters LEVEL, INDEX, LANGUAGE, PREF, ALTID, TYPE. A hobby is something one actively does; an interest one merely finds interesting.ORG-DIRECTORY: any number; a URI for an organisation-directory lookup; parameters PREF, INDEX, LANGUAGE.INDEX=an integer, to order items.LEVEL=isbeginner,averageorexpertonEXPERTISEandhigh,mediumorlowonHOBBYandINTEREST. Example:EXPERTISE;LEVEL=beginner;INDEX=2:chinese literature.
TEL type main-number (RFC 7852)
An additional TYPE value on TEL for the main number of an enterprise, as opposed to a direct-dial number; the RFC defines it for xCard in emergency-call additional data.
Updated and new elements (RFC 9554)
Ngains two components after the five: secondary surname and generation (II,XVI,Jr.); the value islist-component 6(";" list-component). Writers should also keep the old counterparts (secondary surname inside family names, generation inside honorific suffixes); readers should ignore a value in the old component if an equal one is in the new one. Example:N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.;;Jr..SORT-ASapplies to the new components too.ADRgains eleven components after the seven, in this order: room, suite or identifier; apartment, extension or box number; floor or level; street number; street name; building, tower or condominium; block; subdistrict; district; landmark; cardinal direction or quadrant. Writers should still write the combined value in the street component; readers should ignore that component if any new one is set. Example:ADR;GEO="geo:12.3457,78.910":;;123 Main Street;Any Town;CA;91921-1234;U.S.A;;;;123;Main Street;;;;;;.CREATED(at most one): a timestamp of when the vCard was created, unchanged by copying; parameter VALUE=timestamp.GRAMGENDER(any number): the grammatical gender to use in salutations;animate,common,feminine,inanimate,masculine,neuter, iana-token or x-name; copies are told apart by theLANGUAGEparameter.LANGUAGE(at most one): the default Language-Tag of text values in the card; a property's ownLANGUAGEparameter overrides it; this property takes noLANGUAGEparameter.PRONOUNS(any number): free text such asxe/xir; parameters LANGUAGE, PREF, TYPE, ALTID.SOCIALPROFILE(any number): a URI (default) or text; with a text valueSERVICE-TYPEis required; at most oneSERVICE-TYPE; names are equal if they match case-insensitively.- Parameters.
AUTHOR(a quoted URI) andAUTHOR-NAME(non-empty text) say who wrote a property value;CREATED(a timestamp) when a property was created;DERIVED(trueorfalse, default false) marks a value computed from other properties (clients must not update it when true);LABEL(formatted address, now registered);PHONETIC(ipa,jyut,piny,script; forADRandN) says the property holds the pronunciation of another property of the same name, linked by an equalALTID, with a component at the same position wherever one is set, and withSCRIPTset when the value isscript;SCRIPT(a four-letter script subtag such asLatn);PROP-ID(1 to 255 ofA-Za-z0-9,-,_; identifies a property among same-named siblings);SERVICE-TYPEandUSERNAME(case-sensitive; onIMPPandSOCIALPROFILE; withUSERNAMEthe value must be a URI). - Values.
TYPE=billingandTYPE=deliveryonADR.
JSContact conversion (RFC 9555)
RFC 9555 defines how a vCard maps to a JSContact card (JSON, RFC 9553). The vCard side adds:
JSPROP(any number): a JSContact property that has no vCard equivalent, written as the compact JSON text of its value;JSPTRis required, andVALUE=TEXTand extension parameters are allowed. Example:JSPROP;JSPTR="example.com:foo":{"bar":1234}. The pointer is relative to the card and may not reach into an array. AllJSPROPlines together form a patch object applied after everything else is converted.JSPTR: a quoted JSON pointer (RFC 6901).JSCOMPS: a quoted, semicolon-separated list that preserves the order and separators of name or address components: the first entry is the default separator (s,followed by its text, or empty), then entries that are positions (indexorindex,subindexinto the structured value) or separators (s,then text, with comma and semicolon escaped, RFC 6868 encoding). It is valid only if every index exists and the number of position entries equals the number of component values after removing the duplicates caused by backward-compatible copies (secondary surname, generation, street).
The mapping of each vCard property to JSContact is the subject of that RFC and not part of the vCard file format.
vCard in XML: xCard (RFC 6351)
Namespace urn:ietf:params:xml:ns:vcard-4.0 (the version is in the namespace, so there is no VERSION element); media type
application/vcard+xml (charset UTF-8 strongly recommended).
- The root is
vcardsand contains one or morevcardelements. Property and parameter names become lower-case element names (FNbecomesfn). A property element contains an optionalparameterselement and then its value inside a typed value element (text,uri, ...); parameters with lists repeat the value element. - Structured values become element trees with named children (
surname,given, ...); the names are positional in plain vCard and have no vCard equivalent. A group is thegroupelement with anameattribute. - Folding does not exist in XML: convert after unfolding and fold after converting back.
- Extensions:
X-andVND-...-names becomex-andvnd-...-elements; extension elements with no plain-vCard form should use an XML namespace and are kept in vCard as theXMLproperty (only direct children of the card are converted). A reader ignores elements and attributes whose expanded name it does not know. The schema cannot check cardinalities, which must still be respected, and some enumerations have a fixed order. - A property of unknown default value type and no
VALUEparameter, and any unrecognised parameter, is written with the value elementunknownholding the raw text.
vCard in JSON: jCard (RFC 7095)
Media type application/vcard+json (optional version parameter).
- Order of conversion: unfold, remove vCard escaping, apply JSON escaping; reverse on the way back, then fold long lines.
- Card: a two-element array,
"vcard"and an array of properties;BEGINandENDare not written. Several cards: a JSON array of them.versionmust be the first property and keeps the value4.0. - Property: an array of lower-case name, parameter object (
{}if none), lower-case value type, then the value (four elements for a single value, more for several values). Parameter keys are lower-case, values keep their case, list values are arrays of strings (single values may be strings).VALUEis not written (the type string replaces it) and is added back when the type differs from the default and the type is notunknown. - Groups are the parameter
group(lower-case string), never a name prefix; the parameter is registered but must not appear in vCard. - Structured values (
N,ADR,GENDER,ORG) are arrays with one element per component, an empty string for an empty component; a component with several values is a nested array.["adr", {}, "text", ["", "", "123 Main Street", "Any Town", "CA", "91921-1234", "U.S.A."]]. - Dates and times use the ISO 8601 extended format (
1985-04-12,1985-04,--04-12,---12); where the extended format does not apply the basic format is used. Other values are JSON strings, numbers and booleans by type. - Unknown properties (default type not known, no
VALUE) are written with typeunknownand the raw string value (usingtextwould add escaping and break the round trip); an unrecognised parameter is converted to a string. The type nameUNKNOWNis reserved and never appears in a real vCard. When converting back,VALUEis left out forunknownand may be left out when the type is the default.