rfc9553.original   rfc9553.txt 
Calendaring Extensions R. Stepanek Internet Engineering Task Force (IETF) R. Stepanek
Internet-Draft Fastmail Request for Comments: 9553 Fastmail
Intended status: Standards Track M. Loffredo Category: Standards Track M. Loffredo
Expires: 12 May 2024 IIT-CNR ISSN: 2070-1721 IIT-CNR
9 November 2023 March 2024
JSContact: A JSON representation of contact data JSContact: A JSON Representation of Contact Data
draft-ietf-calext-jscontact-16
Abstract Abstract
This specification defines a data model and JSON representation of This specification defines a data model and JavaScript Object
contact card information that can be used for data storage and Notation (JSON) representation of contact card information that can
exchange in address book or directory applications. It aims to be an be used for data storage and exchange in address book or directory
alternative to the vCard data format and to be unambiguous, applications. It aims to be an alternative to the vCard data format
extendable and simple to process. In contrast to the JSON-based and to be unambiguous, extendable, and simple to process. In
jCard format, it is not a direct mapping from the vCard data model contrast to the JSON-based jCard format, it is not a direct mapping
and expands semantics where appropriate. from the vCard data model and expands semantics where appropriate.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This is an Internet Standards Track document.
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months This document is a product of the Internet Engineering Task Force
and may be updated, replaced, or obsoleted by other documents at any (IETF). It represents the consensus of the IETF community. It has
time. It is inappropriate to use Internet-Drafts as reference received public review and has been approved for publication by the
material or to cite them other than as "work in progress." Internet Engineering Steering Group (IESG). Further information on
Internet Standards is available in Section 2 of RFC 7841.
This Internet-Draft will expire on 12 May 2024. Information about the current status of this document, any errata,
and how to provide feedback on it may be obtained at
https://www.rfc-editor.org/info/rfc9553.
Copyright Notice Copyright Notice
Copyright (c) 2023 IETF Trust and the persons identified as the Copyright (c) 2024 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents
license-info) in effect on the date of publication of this document. (https://trustee.ietf.org/license-info) in effect on the date of
Please review these documents carefully, as they describe your rights publication of this document. Please review these documents
and restrictions with respect to this document. Code Components carefully, as they describe your rights and restrictions with respect
extracted from this document must include Revised BSD License text as to this document. Code Components extracted from this document must
described in Section 4.e of the Trust Legal Provisions and are include Revised BSD License text as described in Section 4.e of the
provided without warranty as described in the Revised BSD License. Trust Legal Provisions and are provided without warranty as described
in the Revised BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 1. Introduction
1.1. Motivation and Relation to vCard, jCard and xCard . . . . 5 1.1. Motivation and Relation to vCard, jCard, and xCard
1.2. Notational Conventions . . . . . . . . . . . . . . . . . 5 1.2. Notational Conventions
1.3. Data Type Notations . . . . . . . . . . . . . . . . . . . 6 1.3. Data Type Notations
1.3.1. Objects and Properties . . . . . . . . . . . . . . . 6 1.3.1. Objects and Properties
1.3.2. Type Signatures . . . . . . . . . . . . . . . . . . . 7 1.3.2. Type Signatures
1.3.3. Property Attributes . . . . . . . . . . . . . . . . . 7 1.3.3. Property Attributes
1.3.4. The @type Property . . . . . . . . . . . . . . . . . 8 1.3.4. The @type Property
1.4. Common Data Types . . . . . . . . . . . . . . . . . . . . 8 1.4. Common Data Types
1.4.1. Id . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4.1. Id
1.4.2. Int and UnsignedInt . . . . . . . . . . . . . . . . . 9 1.4.2. Int and UnsignedInt
1.4.3. PatchObject . . . . . . . . . . . . . . . . . . . . . 9 1.4.3. PatchObject
1.4.4. Resource . . . . . . . . . . . . . . . . . . . . . . 10 1.4.4. Resource
1.4.5. UTCDateTime . . . . . . . . . . . . . . . . . . . . . 11 1.4.5. UTCDateTime
1.5. Common Properties . . . . . . . . . . . . . . . . . . . . 12 1.5. Common Properties
1.5.1. contexts . . . . . . . . . . . . . . . . . . . . . . 12 1.5.1. contexts
1.5.2. extra . . . . . . . . . . . . . . . . . . . . . . . . 12 1.5.2. extra
1.5.3. label . . . . . . . . . . . . . . . . . . . . . . . . 12 1.5.3. label
1.5.4. pref . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.4. pref
1.5.5. phonetic . . . . . . . . . . . . . . . . . . . . . . 13 1.5.5. phonetic
1.6. Internationalization . . . . . . . . . . . . . . . . . . 14 1.6. Internationalization
1.6.1. Free-form text . . . . . . . . . . . . . . . . . . . 14 1.6.1. Free-Form Text
1.6.2. URIs . . . . . . . . . . . . . . . . . . . . . . . . 15 1.6.2. URIs
1.7. Validating JSContact . . . . . . . . . . . . . . . . . . 15 1.7. Validating JSContact
1.7.1. Case-Sensitivity . . . . . . . . . . . . . . . . . . 15 1.7.1. Case-Sensitivity
1.7.2. IANA-registered Properties . . . . . . . . . . . . . 16 1.7.2. IANA-Registered Properties
1.7.3. Unknown Properties . . . . . . . . . . . . . . . . . 16 1.7.3. Unknown Properties
1.7.4. Enumerated Values . . . . . . . . . . . . . . . . . . 16 1.7.4. Enumerated Values
1.8. Vendor-Specific Extensions . . . . . . . . . . . . . . . 17 1.8. Vendor-Specific Extensions
1.8.1. Vendor-specific Properties . . . . . . . . . . . . . 17 1.8.1. Vendor-Specific Properties
1.8.2. Vendor-specific Values . . . . . . . . . . . . . . . 18 1.8.2. Vendor-Specific Values
1.9. Versioning . . . . . . . . . . . . . . . . . . . . . . . 19 1.9. Versioning
1.9.1. Version Format and Requirements . . . . . . . . . . . 19 1.9.1. Version Format and Requirements
1.9.2. Current Version . . . . . . . . . . . . . . . . . . . 19 1.9.2. Current Version
2. Card . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2. Card
2.1. Metadata Properties . . . . . . . . . . . . . . . . . . . 20 2.1. Metadata Properties
2.1.1. @type . . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.1. @type
2.1.2. version . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.2. version
2.1.3. created . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.3. created
2.1.4. kind . . . . . . . . . . . . . . . . . . . . . . . . 21 2.1.4. kind
2.1.5. language . . . . . . . . . . . . . . . . . . . . . . 21 2.1.5. language
2.1.6. members . . . . . . . . . . . . . . . . . . . . . . . 21 2.1.6. members
2.1.7. prodId . . . . . . . . . . . . . . . . . . . . . . . 22 2.1.7. prodId
2.1.8. relatedTo . . . . . . . . . . . . . . . . . . . . . . 22 2.1.8. relatedTo
2.1.9. uid . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.1.9. uid
2.1.10. updated . . . . . . . . . . . . . . . . . . . . . . . 24 2.1.10. updated
2.2. Name and Organization Properties . . . . . . . . . . . . 25 2.2. Name and Organization Properties
2.2.1. name . . . . . . . . . . . . . . . . . . . . . . . . 25 2.2.1. name
2.2.2. organizations . . . . . . . . . . . . . . . . . . . . 30 2.2.2. organizations
2.2.3. speakToAs . . . . . . . . . . . . . . . . . . . . . . 31 2.2.3. speakToAs
2.2.4. titles . . . . . . . . . . . . . . . . . . . . . . . 32 2.2.4. titles
2.3. Contact Properties . . . . . . . . . . . . . . . . . . . 33 2.3. Contact Properties
2.3.1. emails . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.1. emails
2.3.2. onlineServices . . . . . . . . . . . . . . . . . . . 34 2.3.2. onlineServices
2.3.3. phones . . . . . . . . . . . . . . . . . . . . . . . 35 2.3.3. phones
2.3.4. preferredLanguages . . . . . . . . . . . . . . . . . 37 2.3.4. preferredLanguages
2.4. Calendaring and Scheduling Properties . . . . . . . . . . 38 2.4. Calendaring and Scheduling Properties
2.4.1. calendars . . . . . . . . . . . . . . . . . . . . . . 38 2.4.1. calendars
2.4.2. schedulingAddresses . . . . . . . . . . . . . . . . . 38 2.4.2. schedulingAddresses
2.5. Address and Location Properties . . . . . . . . . . . . . 39 2.5. Address and Location Properties
2.5.1. addresses . . . . . . . . . . . . . . . . . . . . . . 39 2.5.1. addresses
2.6. Resource Properties . . . . . . . . . . . . . . . . . . . 44 2.6. Resource Properties
2.6.1. cryptoKeys . . . . . . . . . . . . . . . . . . . . . 45 2.6.1. cryptoKeys
2.6.2. directories . . . . . . . . . . . . . . . . . . . . . 45 2.6.2. directories
2.6.3. links . . . . . . . . . . . . . . . . . . . . . . . . 46 2.6.3. links
2.6.4. media . . . . . . . . . . . . . . . . . . . . . . . . 47 2.6.4. media
2.7. Multilingual Properties . . . . . . . . . . . . . . . . . 48 2.7. Multilingual Properties
2.7.1. localizations . . . . . . . . . . . . . . . . . . . . 48 2.7.1. localizations
2.8. Additional Properties . . . . . . . . . . . . . . . . . . 50 2.8. Additional Properties
2.8.1. anniversaries . . . . . . . . . . . . . . . . . . . . 50 2.8.1. anniversaries
2.8.2. keywords . . . . . . . . . . . . . . . . . . . . . . 52 2.8.2. keywords
2.8.3. notes . . . . . . . . . . . . . . . . . . . . . . . . 52 2.8.3. notes
2.8.4. personalInfo . . . . . . . . . . . . . . . . . . . . 53 2.8.4. personalInfo
3. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 54 3. IANA Considerations
3.1. Media Type Registration . . . . . . . . . . . . . . . . . 54 3.1. Media Type Registration
3.2. Creation of the "JSContact" Registry Group . . . . . . . 56 3.2. Creation of the JSContact Registry Group
3.3. Registry Policy and Change Procedures . . . . . . . . . . 56 3.3. Registry Policy and Change Procedures
3.3.1. Preliminary Community Review . . . . . . . . . . . . 57 3.3.1. Preliminary Community Review
3.3.2. Submit Request to IANA . . . . . . . . . . . . . . . 57 3.3.2. Submit Request to IANA
3.3.3. Designated Expert Review . . . . . . . . . . . . . . 57 3.3.3. Designated Expert Review
3.3.4. Change Procedures . . . . . . . . . . . . . . . . . . 58 3.3.4. Change Procedures
3.4. Creation of the "JSContact Version" Registry . . . . . . 58 3.4. Creation of the JSContact Version Registry
3.4.1. "JSContact Version" Registry Template . . . . . . . . 58 3.4.1. JSContact Version Registry Template
3.4.2. Initial Contents for the "JSContact Version" 3.4.2. Initial Contents of the JSContact Version Registry
Registry . . . . . . . . . . . . . . . . . . . . . . 59 3.5. Creation of the JSContact Properties Registry
3.5.1. JSContact Properties Registry Template
3.5. Creation of the "JSContact Properties" Registry . . . . . 59 3.5.2. Initial Contents of the JSContact Properties Registry
3.5.1. "JSContact Properties" Registry Template . . . . . . 59 3.6. Creation of the JSContact Types Registry
3.5.2. Initial Contents for the "JSContact Properties" 3.6.1. JSContact Types Registry Template
Registry . . . . . . . . . . . . . . . . . . . . . . 60 3.6.2. Initial Contents of the JSContact Types Registry
3.6. Creation of the "JSContact Types" Registry . . . . . . . 69 3.7. Creation of the JSContact Enum Values Registry
3.6.1. "JSContact Types" Registry Template . . . . . . . . . 69 3.7.1. JSContact Enum Values Registry Property Template
3.6.2. Initial Contents for the "JSContact Types" 3.7.2. JSContact Enum Values Registry Value Template
Registry . . . . . . . . . . . . . . . . . . . . . . 70 3.7.3. Initial Contents of the JSContact Enum Values Registry
3.7. Creation of the "JSContact Enum Values" Registry . . . . 72 4. Security Considerations
3.7.1. "JSContact Enum Values" Registry Property Template . 72 4.1. JSON Parsing
3.7.2. "JSContact Enum Values" Registry Value Template . . . 73 4.2. URI Values
3.7.3. Initial Contents for the "JSContact Enum Values" 5. References
Registry . . . . . . . . . . . . . . . . . . . . . . 73 5.1. Normative References
4. Security Considerations . . . . . . . . . . . . . . . . . . . 82 5.2. Informative References
4.1. JSON Parsing . . . . . . . . . . . . . . . . . . . . . . 82 Authors' Addresses
4.2. URI Values . . . . . . . . . . . . . . . . . . . . . . . 83
5. References . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.1. Normative References . . . . . . . . . . . . . . . . . . 83
5.2. Informative References . . . . . . . . . . . . . . . . . 85
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 87
1. Introduction 1. Introduction
This document defines a data model for contact card data normally This document defines a data model for contact card data normally
used in address book or directory applications and services. It aims used in address book or directory applications and services. It aims
to be an alternative to the vCard data format [RFC6350]. to be an alternative to the vCard data format [RFC6350].
The key design considerations for this data model are as follows: The key design considerations for this data model are as follows:
* The data model and set of attributes should mostly be compatible * The data model and set of attributes should be mostly compatible
with the one defined for the vCard data format [RFC6350] and with the model defined for the vCard data format [RFC6350] and
extensions ([RFC6473], [RFC6474], [RFC6715], [RFC6869], extensions [RFC6473] [RFC6474] [RFC6715] [RFC6869] [RFC8605]. The
[RFC8605]). The specification should add new attributes or value specification should add new attributes or value types where
types where appropriate. Not all existing vCard definitions need appropriate. Not all existing vCard definitions need an
an equivalent in JSContact, especially if the vCard definition is equivalent in JSContact, especially if the vCard definition is
considered to be obsolete or otherwise inappropriate. Conversion considered to be obsolete or otherwise inappropriate. Conversion
between the data formats need not fully preserve semantic meaning. between the data formats need not fully preserve semantic meaning.
* The attributes of the card data represented must be described as * The attributes of the card data represented must be described as
simple key-value pairs, reducing complexity of their simple key-value pairs, reducing complexity of their
representation. representation.
* The data model should avoid all ambiguities and make it difficult * The data model should avoid all ambiguities and make it difficult
to make mistakes during implementation. to make mistakes during implementation.
* Extensions, such as new properties and components, MUST NOT lead * Extensions, such as new properties and components, MUST NOT lead
to requiring an update to this document. to a required update of this document.
The representation of this data model is defined in the I-JSON format The representation of this data model is defined in the Internet JSON
[RFC7493], which is a strict subset of the JavaScript Object Notation (I-JSON) format [RFC7493], which is a strict subset of the JSON data
(JSON) Data Interchange Format [RFC8259]. Using JSON is mostly a interchange format [RFC8259]. Using JSON is mostly a pragmatic
pragmatic choice: its widespread use makes JSContact easier to adopt, choice: its widespread use makes JSContact easier to adopt, and the
and the availability of production-ready JSON implementations availability of production-ready JSON implementations eliminates a
eliminates a whole category of parser-related interoperability whole category of parser-related interoperability issues.
issues.
1.1. Motivation and Relation to vCard, jCard and xCard 1.1. Motivation and Relation to vCard, jCard, and xCard
The vCard data format [RFC6350] is an interchange format for contacts The vCard data format [RFC6350] is an interchange format for contacts
data between address book service providers and vendors. However, data between address book service providers and vendors. However,
this format has gone through multiple specifications iterations with this format has gone through multiple specification iterations with
only a subset of its deprecated version 3 [RFC2426] being widely in only a subset of its deprecated version 3 [RFC2426] being widely in
use. Consequently, products and services internally use a richer use. Consequently, products and services use an internal contact
contact data model than they expose when serializing that information data model that is richer than what they expose when serializing that
to vCard. In addition, service providers often use a proprietary information to vCard. In addition, service providers often use a
JSON representation of contact data in their APIs. proprietary JSON representation of contact data in their APIs.
JSContact provides a standard JSON-based data model and JSContact provides a standard JSON-based data model and
representation of contact data as an alternative to proprietary representation of contact data as an alternative to proprietary
formats. formats.
While writing this document, several features missing in vCard were At the time of writing this document, several missing features in
brought to the attention of the authors, such as social media vCard were brought to the attention of the authors such as social
contacts, gender pronouns and others. This highlights how vCard is media contacts, gender pronouns, and others. This highlights how
not perceived as an evolving format and consequently hasn't been vCard is not perceived as an evolving format and, consequently,
updated since close to ten years. JSContact addresses these unmet hasn't been updated for about ten years. JSContact addresses these
demands and defines new vCard properties and parameters to allow unmet demands and defines new vCard properties and parameters to
interchanging them in both formats. allow interchanging them in both formats.
The xCard [RFC6351] and jCard [RFC7095] specifications define The xCard [RFC6351] and jCard [RFC7095] specifications define
alternative representations for vCard data, in XML and JSON format alternative representations for vCard data in XML and JSON formats,
respectively. Both explicitly aim to not change the underlying data respectively. Both explicitly aim to not change the underlying data
model. Accordingly, they are regarded as equal to vCard in the model. Accordingly, they are regarded as equal to vCard in the
context of this document. context of this document.
1.2. Notational Conventions 1.2. Notational Conventions
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in "OPTIONAL" in this document are to be interpreted as described in BCP
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here. capitals, as shown here.
The ABNF definitions in this document use the notations of [RFC5234]. The ABNF definitions in this document use the notations of [RFC5234].
ABNF rules not defined in this document either are defined in ABNF rules not defined in this document are defined in either
[RFC5234] (such as the ABNF for CRLF, WSP, DQUOTE, VCHAR, ALPHA, and [RFC5234] (such as the ABNF for CRLF, WSP, DQUOTE, VCHAR, ALPHA, and
DIGIT) or [RFC6350]. DIGIT) or [RFC6350].
1.3. Data Type Notations 1.3. Data Type Notations
This section introduces the notations and terminology used to define This section introduces the notations and terminology used to define
data types in JSContact. data types in JSContact.
The underlying format for JSContact is JSON and so also its data The underlying format for JSContact is JSON, so its data types also
types build on JSON values. The terms "object" and "array" as well build on JSON values. The terms "object" and "array" as well as the
as the four primitive types ("strings", "numbers", "booleans", and four primitive types ("strings", "numbers", "booleans", and "null")
"null") are to be interpreted as described in Section 1 of [RFC8259]. are to be interpreted as described in Section 1 of [RFC8259]. All
All JSContact data MUST be valid according to the constraints given JSContact data MUST be valid according to the constraints given in
in I-JSON [RFC7493]. Unless otherwise noted, all member names in I-JSON [RFC7493]. Unless otherwise noted, all member names in JSON
JSON objects and all string values are case-sensitive. Within objects and all string values are case-sensitive. Within the context
context of JSON objects, the term "key" is synonymous with "member of JSON objects, the term "key" is synonymous with "member name" as
name" as defined in Section 1 of [RFC8259]. defined in Section 1 of [RFC8259].
1.3.1. Objects and Properties 1.3.1. Objects and Properties
JSContact defines data types for contact information such as JSContact defines data types for contact information such as
addresses or names. This information typically consists of multiple addresses or names. This information typically consists of multiple
related elements, for example a personal name and surname together related elements; for example, a personal name and surname together
form a name. These related elements are organized in JSContact form a name. These related elements are organized in JSContact
objects. A JSContact object is a JSON object which: objects. A JSContact object is a JSON object that has the following:
1. Has a unique type name registered in the IANA JSContact Types 1. A unique type name registered in the IANA "JSContact Types"
Registry (Section 3.6). registry (Section 3.6).
2. Has one or more object members for which the name and allowed 2. One or more object members for which the name and allowed value
value types are specified. Such members are called "properties". types are specified. Such members are called "properties".
3. Has one property named @type with a string value that matches the 3. One property named @type with a string value that matches the
type name of this JSContact object. In general, this property type name of the JSContact object. In general, this property
does not need to be set explicitly as outlined in Section 1.3.4. does not need to be set explicitly as outlined in Section 1.3.4.
The following sections specify how to define JSContact object types. The following sections specify how to define JSContact object types.
Section 1.7 and Section 1.8 then define the exact requirements for Sections 1.7 and 1.8 then define the exact requirements for property
property names. names.
The next paragraph illustrates how a JSContact object is defined: The next paragraph illustrates how a JSContact object is defined.
| A Foo object has the following properties: A Foo object has the following properties:
|
| * qux: Number (mandatory). Defines the qux-ishness of this qux: Number (mandatory). Defines the qux-ishness of this contact.
| contact. The value MUST be an integer greater than 0 and less The value MUST be an integer greater than 0 and less than 10.
| than 10.
Here, a JSContact object type named Foo is defined. In addition to Here, a JSContact object type named Foo is defined. In addition to
its @type property it has a property named qux for which values MUST its @type property, it has a property named qux for which values MUST
be valid according to the definition of the Number type. The be valid according to the definition of the Number type. The
property has one attribute, mandatory, which specifies that the property has one attribute, mandatory, which specifies that the
property MUST be present for an instance of this JSContact object to property MUST be present for an instance of this JSContact object to
be valid. Finally, a free-text description describes the semantics be valid. Finally, a free-text description describes the semantics
and further restrictions. and further restrictions.
1.3.2. Type Signatures 1.3.2. Type Signatures
Type signatures are given for all JSON values and JSContact Type signatures are given for all JSON values and JSContact
definitions in this document. The following conventions are used: definitions in this document. The following conventions are used:
* String - The JSON string type. String: The JSON string type.
* Number - The JSON number type. Number: The JSON number type.
* Boolean - The JSON boolean type. Boolean: The JSON boolean type.
* A[B] - A JSON object where the keys are all of the type A, and the A[B]: A JSON object where all keys are of type A and all values are
values are all of the type B. of type B.
* A[] - A JSON array of values of type A. A[]: A JSON array of values of type A.
* A|B - The value is either of type A or of type B. A|B: The value is either of type A or of type B.
* * - The type is undefined (the value could be any type, although * *: The type is undefined (the value could be any type, although
permitted values may be constrained by the context of this value). permitted values may be constrained by the context of this value).
Section 1.4 defines common data types, including signed or unsigned Section 1.4 defines common data types, including signed or unsigned
integers and dates. integers and dates.
1.3.3. Property Attributes 1.3.3. Property Attributes
Object properties may also have a set of attributes defined along Object properties may also have a set of attributes defined along
with the type signature. These have the following meanings: with the type signature. These have the following meanings:
* mandatory: The property MUST be set for an instance of this object mandatory: The property MUST be set for an instance of this object
to be valid. to be valid.
* optional: The property can but not need be set for an instance of optional: The property can, but need not, be set for an instance of
this object to be valid. this object to be valid.
* default: This is followed by a JSON value. That value will be default: This is followed by a JSON value. That value will be used
used for this property if it is omitted. for this property if it is omitted.
* defaultType: This is followed by the name of a JSContact object defaultType: This is followed by the name of a JSContact object
type. A property value of JSContact object type is expected to be type. A property value of JSContact object type is expected to be
of this named type, in case it omits the @type property. of this named type, in case it omits the @type property.
1.3.4. The @type Property 1.3.4. The @type Property
This property is defined as: @type: String. Specifies the type of the object. It MUST match the
type name of the JSContact object of which the JSON object is an
* @type: String. Specifies the type of this object. This MUST instance of.
match the type name of the JSContact object of which this JSON
object is an instance of.
The purpose of this property is to help implementations identify The purpose of the @type property is to help implementations identify
which JSContact object type a given JSON object represents. which JSContact object type a given JSON object represents.
Implementations MUST validate that JSON objects with this property Implementations MUST validate that JSON objects with this property
conform to the specification of the JSContact object type of that conform to the specification of the JSContact object type of that
name. name.
In many cases the @type property value is implied by where its object In many cases, the @type property value is implied by where its
occurs in JSContact data. Assuming that both A and B are JSContact object occurs in JSContact data. Assuming that both A and B are
object types: JSContact object types:
* An object that is set as the value for a property with type * An object that is set as the value for a property with type
signature A MAY have the @type property set. If the @type signature A MAY have the @type property set. If the @type
property is not set then its value is implied to be A by the property is not set, then its value is implied to be A by the
property definition. property definition.
* An object that is set as the value for a property with type * An object that is set as the value for a property with type
signature A|B (defaultType: A) MAY have the @type property set if signature A|B (defaultType: A) MAY have the @type property set if
it is an instance of A. It MUST have the @type property set if it it is an instance of A. It MUST have the @type property set if it
is an instance of B. If instead the defaultType attribute is not is an instance of B. If, instead, the defaultType attribute is
defined then the @type property MUST also be set for A. not defined, then the @type property MUST also be set for A.
* An object that is not the value of a property, such as the root of * An object that is not the value of a property, such as the root of
JSON data (directly or as member of an array), MUST have the @type JSON data (directly or as a member of an array), MUST have the
property set. @type property set.
1.4. Common Data Types 1.4. Common Data Types
In addition to the standard JSON data types, a couple of additional In addition to the standard JSON data types, a couple of additional
data types are common to the definitions of JSContact objects and data types are common to the definitions of JSContact objects and
properties. properties.
1.4.1. Id 1.4.1. Id
Where Id is given as a data type, it means a String of at least 1 and Where Id is given as a data type, it means a String of at least 1 and
a maximum of 255 octets in size, and it MUST only contain characters a maximum of 255 octets in size, and it MUST only contain characters
from the URL and Filename Safe base64url alphabet, as defined in from the URL and Filename Safe base64url alphabet, as defined in
Section 5 of [RFC4648], excluding the pad character (=). This means Section 5 of [RFC4648], excluding the pad character (=). This means
the allowed characters are the ASCII alphanumeric characters (A-Za- the allowed characters are the ASCII alphanumeric characters (A-Za-
z0-9), hyphen (-), and underscore (_). z0-9), hyphen (-), and underscore (_).
In many places in JSContact a JSON map is used where the map keys are In many places in JSContact, a JSON map is used where the map keys
of type Id and the map values are all the same type of object. This are of type Id and the map values are all the same type of object.
construction represents an unordered set of objects, with the added This construction represents an unordered set of objects, with the
advantage that each entry has a name (the corresponding map key). added advantage that each entry has a name (the corresponding map
This allows for more concise patching of objects, and, when key). This allows for more concise patching of objects and, when
applicable, for the objects in question to be referenced from other applicable, for the objects in question to be referenced from other
objects within the JSContact object. The map keys MUST be preserved objects within the JSContact object. The map keys MUST be preserved
across multiple versions of the JSContact object. across multiple versions of the JSContact object.
Unless otherwise specified for a particular property, there are no Unless otherwise specified for a particular property, there are no
uniqueness constraints on an Id value (other than, of course, the uniqueness constraints on an Id value (other than, of course, the
requirement that you cannot have two values with the same key within requirement that you cannot have two values with the same key within
a single JSON map). For example, two Card (Section 2) objects might a single JSON map). For example, two Card (Section 2) objects might
use the same Ids in their respective photos properties. Or within use the same Ids in their respective photos properties. Or within
the same Card the same Id could appear in the emails and phones the same Card, the same Id could appear in the emails and phones
properties. These situations do not imply any semantic connections properties. These situations do not imply any semantic connections
among the objects. among the objects.
1.4.2. Int and UnsignedInt 1.4.2. Int and UnsignedInt
Where Int is given as a data type, it means an integer in the range Where Int is given as a data type, it means an integer in the range
-2^53+1 <= value <= 2^53-1, the safe range for integers stored in a -2^53+1 <= value <= 2^53-1, which is the safe range for integers
floating-point double, represented as a JSON Number. stored in a floating-point double, represented as a JSON Number.
Where UnsignedInt is given as a data type, it means an integer in the Where UnsignedInt is given as a data type, it means an integer in the
range 0 <= value <= 2^53-1, represented as a JSON Number. range 0 <= value <= 2^53-1 represented as a JSON Number.
1.4.3. PatchObject 1.4.3. PatchObject
A PatchObject is of type String[*], and represents an unordered set A PatchObject is of type String[*] and represents an unordered set of
of patches on a JSON object. Each key is a path represented in a patches on a JSON object. Each key is a path represented in a subset
subset of JSON pointer format [RFC6901]. The paths have an implicit of the JSON Pointer format [RFC6901]. The paths have an implicit
leading /, so each key is prefixed with / before applying the JSON leading /, so each key is prefixed with / before applying the JSON
pointer evaluation algorithm. Pointer evaluation algorithm.
A patch within a PatchObject is only valid if all the following A patch within a PatchObject is only valid if all the following
conditions apply: conditions apply:
1. The pointer MAY reference inside an array but if the last 1. The pointer MAY reference inside an array, but if the last
reference token in the pointer is an array index, then the patch reference token in the pointer is an array index, then the patch
value MUST NOT be null. The pointer MUST NOT use "-" as an array value MUST NOT be null. The pointer MUST NOT use "-" as an array
index in any of its reference tokens (i.e., you MUST NOT insert/ index in any of its reference tokens (i.e., you MUST NOT insert/
delete from an array, but you MAY replace the contents of its delete from an array, but you MAY replace the contents of its
existing members. To add or remove members, one needs to replace existing members. To add or remove members, one needs to replace
the complete array value). the complete array value).
2. All reference tokens prior to the last (i.e., the value after the 2. All reference tokens prior to the last (i.e., the value after the
final slash) MUST already exist as values in the object being final slash) MUST already exist as values in the object being
patched. If the last reference token is an array index, then a patched. If the last reference token is an array index, then a
member at this index MUST already exist in the referenced array. member at this index MUST already exist in the referenced array.
3. There MUST NOT be two patches in the PatchObject where the 3. There MUST NOT be two patches in the PatchObject where the
pointer of one is the prefix of the pointer of the other, e.g., pointer of one is the prefix of the pointer of the other, e.g.,
addresses/1/city and addresses. addresses/1/city and addresses.
4. The value for the patch MUST be valid for the property being set 4. The value for the patch MUST be valid for the property being set
(of the correct type and obeying any other applicable (of the correct type and obeying any other applicable
restrictions), or if null the property MUST be optional. restrictions), or if null, the property MUST be optional.
The value associated with each pointer determines how to apply that The value associated with each pointer determines how to apply that
patch: patch:
* If null, remove the property from the patched object. If the key * If null, remove the property from the patched object. If the key
is not present in the parent, this is a no-op. is not present in the parent, this is a no-op.
* If non-null, set the value given as the value for this property * If non-null, set the value given as the value for this property
(this may be a replacement or addition to the object being (this may be a replacement or addition to the object being
patched). patched).
A PatchObject does not define its own @type (Section 1.3.4) property. A PatchObject does not define its own @type (Section 1.3.4) property.
Instead, a @type property in a patch MUST be handled as any other Instead, an @type property in a patch MUST be handled as any other
patched property value. patched property value.
Implementations MUST reject in its entirety a PatchObject if any of Implementations MUST reject a PatchObject in its entirety if any of
its patches are invalid. Implementations MUST NOT apply partial its patches are invalid. Implementations MUST NOT apply partial
patches. patches.
1.4.4. Resource 1.4.4. Resource
This data type defines a resource associated with the entity The Resource data type defines a resource associated with the entity
represented by this Card, identified by a URI [RFC3986]. Several represented by the Card, identified by a URI [RFC3986]. Later in
property definitions later in this document refer to the Resource this document, several property definitions refer to the Resource
data type as the basis for their property-specific value types. The data type as the basis for their property-specific value types. The
Resource data type defines the properties that are common to all of Resource data type defines the properties that are common to all of
them. Property definitions making use of Resource MAY define them. Property definitions making use of Resource MAY define
additional properties for their value types. additional properties for their value types.
The @type property value MUST NOT be Resource, instead it MUST be the The @type property value MUST NOT be Resource; instead, it MUST be
name of a concrete resource type (see Section 2.6). A Resource the name of a concrete resource type (see Section 2.6). A Resource
object has the following properties. object has the following properties.
* @type: String. Specifies the type of this resource object. The @type: String. Specifies the type of this resource object. The
allowed value is defined in later sections of this document for allowed value is defined in later sections of this document for
each concrete resource type (Section 2.6). each concrete resource type (Section 2.6).
* kind: String (optional). The kind of the resource. The allowed kind: String (optional). The kind of the resource. The allowed
values are defined in the property definition that makes use of values are defined in the property definition that makes use of
the Resource type. Some property definitions may change this the Resource type. Some property definitions may change this
property from being optional to mandatory. property from being optional to mandatory.
* uri: String (mandatory). The resource value. This MUST be a uri: String (mandatory). The resource value. This MUST be a _URI_
_URI_ as defined in Section 3 of [RFC3986]. as defined in Section 3 of [RFC3986].
* mediaType: String (optional). Used for URI resource values. mediaType: String (optional). Used for URI resource values.
Provides the media type [RFC2046] of the resource identified by Provides the media type [RFC2046] of the resource identified by
the URI. the URI.
* contexts: String[Boolean] (optional). The contexts in which to contexts: String[Boolean] (optional). The contexts in which to use
use this resource. Also see Section 1.5.1. this resource. Also see Section 1.5.1.
* pref: UnsignedInt (optional). The preference of this resource in pref: UnsignedInt (optional). The preference of the resource in
relation to other resources. Also see Section 1.5.4. relation to other resources. Also see Section 1.5.4.
* label: String (optional). A custom label for the value, see label: String (optional). A custom label for the value. Also see
Section 1.5.3. Section 1.5.3.
1.4.5. UTCDateTime 1.4.5. UTCDateTime
This is a string in [RFC3339] date-time format, with the further UTCDateTime is a string in date-time format [RFC3339], with further
restrictions that any letters MUST be in uppercase, and the time restrictions that any letters MUST be in uppercase and the time
offset MUST be the character Z. Fractional second values MUST NOT be offset MUST be the character Z. Fractional second values MUST NOT be
included unless non-zero and MUST NOT have trailing zeros, to ensure included unless they are non-zero, and they MUST NOT have trailing
there is only a single representation for each date-time. zeros to ensure there is only a single representation for each date-
time.
For example, 2010-10-10T10:10:10.003Z is conformant, but For example, 2010-10-10T10:10:10.003Z is conformant, but
2010-10-10T10:10:10.000Z is invalid and is correctly encoded as 2010-10-10T10:10:10.000Z is invalid; the correct encoding is
2010-10-10T10:10:10Z. 2010-10-10T10:10:10Z.
1.5. Common Properties 1.5. Common Properties
Most of the properties in this document are specific to a single Most of the properties in this document are specific to a single
JSContact object type. Such properties are defined along with the JSContact object type. Such properties are defined along with the
respective object type. The properties in this section are common to respective object type. The properties in this section are common to
multiple data types and are defined here to avoid repetition. Note multiple data types and are defined here to avoid repetition. Note
that these properties MUST only be set for a JSContact object if they that these properties MUST only be set for a JSContact object if they
are explicitly mentioned to be allowed for this object type. are explicitly mentioned as allowable for this object type.
1.5.1. contexts 1.5.1. contexts
Type: String[Boolean] Type: String[Boolean]
This property associates contact information with one or more This property associates contact information with one or more
contexts in which it should be used. For example, someone might have contexts in which it should be used. For example, someone might have
distinct phone numbers for work and private contexts, and may set the distinct phone numbers for work and private contexts and may set the
desired context on the respective phone number in the phones desired context on the respective phone number in the phones
(Section 2.3.3) property. (Section 2.3.3) property.
This section defines common contexts. Additional contexts may be This section defines common contexts. Additional contexts may be
defined in the properties or data types that make use of this defined in the properties or data types that make use of this
property. The enumerated (Section 1.7.4) common context values are: property. The enumerated (Section 1.7.4) common context values are:
* private: the contact information may be used in a private context. * private: the contact information that may be used in a private
context.
* work: the contact information may be used in a professional * work: the contact information that may be used in a professional
context. context.
1.5.2. extra 1.5.2. extra
This is a reserved property name. Implementations MUST NOT set this extra is a reserved property name. Implementations MUST NOT set this
property in a JSContact object. Any JSContact object including a property in a JSContact object. Any JSContact object including a
property with this name MUST be considered invalid. property with this name MUST be considered invalid.
The purpose of this reserved property name is to provide implementors The purpose of this reserved property name is to provide implementors
with a name which is certain to never occur as a property name in a with a name that is certain to never occur as a property name in a
JSContact object. Implementations might want to map unknown or JSContact object. Implementations might want to map unknown or
vendor-specific properties to a variable with this name, but this is vendor-specific properties to a variable with this name, but this is
implementation-specific. implementation-specific.
1.5.3. label 1.5.3. label
Type: String Type: String
This property allows associating contact data with user-defined This property allows associating contact data with user-defined
labels. Such labels may be set for phone numbers, email addresses labels. Such labels may be set for phone numbers, email addresses,
and resources. Typically, these labels are displayed along with and resources. Typically, these labels are displayed along with
their associated contact data in graphical user interfaces. Such their associated contact data in graphical user interfaces. Note
labels best be succinct to properly display on small graphical that succinct labels are best for proper display on small graphical
interfaces and screens. interfaces and screens.
1.5.4. pref 1.5.4. pref
Type: UnsignedInt Type: UnsignedInt
This property allows defining a preference order for contact This property allows defining a preference order for contact
information. For example, a person may have two email addresses and information. For example, a person may have two email addresses and
prefer to be contacted with one of them. prefer to be contacted with one of them.
Its value MUST be in the range 1 and 100. Lower values correspond to Its value MUST be in the range of 1 to 100. Lower values correspond
a higher level of preference, with 1 being most preferred. If no to a higher level of preference, with 1 being most preferred. If no
preference is set, then the contact information MUST be interpreted preference is set, then the contact information MUST be interpreted
as being least preferred. as being least preferred.
Note that the preference only is defined in relation to contact Note that the preference is only defined in relation to contact
information of the same type. For example, the preference orders information of the same type. For example, the preference orders
within emails and phone numbers are independent of each other. within emails and phone numbers are independent of each other.
1.5.5. phonetic 1.5.5. phonetic
This property defines how to pronounce a value in the language The phonetic property defines how to pronounce a value in the
indicated in the Card language (Section 2.1.5) property or the language indicated in the Card language (Section 2.1.5) property or
language tag of its localizations (Section 2.7.1). Exemplary uses the language tag of its localizations (Section 2.7.1). Exemplary
are to define how to pronounce Japanese names, or for romanization of uses of this property are defining how to pronounce Japanese names
Mandarin or Cantonese name and address components. The properties and romanizing Mandarin or Cantonese name and address components.
are defined as follows: The properties are defined as follows:
* phonetic: String. Contains the phonetic representation of a phonetic: String. Contains the phonetic representation of a value.
value. Any script language subtag in the Card language Any script language subtag in the Card language (Section 2.1.5)
(Section 2.1.5) property MUST be ignored for use with the phonetic property MUST be ignored for use with the phonetic property. If
property. If this property is set, then at least one of the this property is set, then at least one of the phoneticScript or
phoneticScript or phoneticSystem properties that relate to this phoneticSystem properties that relate to this value MUST be set.
value MUST be set.
* phoneticScript: String. The script used in the value of the phoneticScript: String. The script used in the value of the related
related phonetic property. This MUST be a valid script subtag as phonetic property. This MUST be a valid script subtag as defined
defined in Section 2.2.3 of [RFC5646]. in Section 2.2.3 of [RFC5646].
* phoneticSystem: String. The phonetic system used in the related phoneticSystem: String. The phonetic system used in the related
value of the phonetic property. The enumerated values value of the phonetic property. The enumerated (Section 1.7.4)
(Section 1.7.4) are: values are:
- ipa: denotes the International Phonetic Alphabet [IPA]. * ipa: denotes the International Phonetic Alphabet [IPA].
- jyut: denotes the Cantonese romanization system "Jyutping". * jyut: denotes the Cantonese romanization system "Jyutping".
- piny: denotes the Standard Mandarin romanization system "Hanyu * piny: denotes the Standard Mandarin romanization system "Hanyu
Pinyin". Pinyin".
The relation between the phoneticSystem, phoneticScript and phonetic The relation between the phoneticSystem, phoneticScript, and phonetic
properties is type-specific. This specification defines this properties is type-specific. This specification defines this
relation in the Name (Section 2.2.1) and Address (Section 2.5.1) relation in the Name (Section 2.2.1) and Address (Section 2.5.1)
object types, respectively. object types, respectively.
The following example illustrates the phonetic property for a name The following example illustrates the phonetic property for a name
(Section 2.2.1): (Section 2.2.1):
"name": { "name": {
"components": [{ "components": [{
"kind": "given", "kind": "given",
"value": "John", "value": "John",
"phonetic": "/ˈdʒɑːn/" "phonetic": "/ˈdʒɑːn/"
}, { }, {
"kind": "surname", "kind": "surname",
"value": "Smith", "value": "Smith",
"phonetic": "/smɪθ/" "phonetic": "/smɪθ/"
}], }],
"phoneticSystem": "ipa" "phoneticSystem": "ipa"
} }
Figure 1: Example of phonetic for the name "John Smith" as Figure 1: Example of a phonetic Property for the Name "John Smith" as
pronounced in the USA. Pronounced in the USA
1.6. Internationalization 1.6. Internationalization
JSContact aims to be used for international contacts and addressbook JSContact aims to be used for international contacts and address book
data. Notably text values such as names and addresses are likely to data. Notably, text values such as names and addresses are likely to
cover a wide range of languages and cultures. This section describes cover a wide range of languages and cultures. This section describes
internationalization for free-form text values, as well as for internationalization for free-form text values as well as Uniform
Uniform Resource Identifiers (URIs). Resource Identifiers (URIs).
1.6.1. Free-form text 1.6.1. Free-Form Text
Properties having free-form text values MAY contain any valid Properties having free-form text values MAY contain any valid
sequence of Unicode characters encoded as a JSON string. Such values sequence of Unicode characters encoded as a JSON string. Such values
can contain unidirectional left-to-right and right-to-left text, as can contain unidirectional left-to-right and right-to-left text, as
well as bidirectional text using Unicode Directional Formatting well as bidirectional text using Unicode Directional Formatting
Characters described in Section 2 of [UBiDi]. Implementations Characters as described in Section 2 of [UBiDi]. Implementations
setting bidirectional text MUST make sure that each property value setting bidirectional text MUST make sure that each property value
complies with the requirements of the Unicode Bidirectional complies with the requirements of the Unicode Bidirectional
Algorithm. Implementations MUST NOT assume that text values of Algorithm. Implementations MUST NOT assume that text values of
adjacent properties are processed or displayed as a combined string, adjacent properties are processed or displayed as a combined string;
for example the values of a given name component and a surname for example, the values of a given name component and a surname
component may or may not to be rendered together. component may or may not be rendered together.
1.6.2. URIs 1.6.2. URIs
Several properties require their string value to be a URI as defined Several properties require their string value to be a URI as defined
in [RFC3986]. Implementations MUST make sure to use proper percent- in [RFC3986]. Implementations MUST make sure to use proper percent-
encoding for URIs that can not be represented using unreserved URI encoding for URIs that cannot be represented using unreserved URI
characters. Section 3.1 of [RFC3987] defines how to convert characters. Section 3.1 of [RFC3987] defines how to convert
Internationalized Resource Identifiers to URIs. JSContact makes no Internationalized Resource Identifiers to URIs. JSContact makes no
recommendation how to display URIs, but section "4.8.3 recommendation on how to display URIs, but the WHATWG URL Living
Internationalization and special characters" of the W3C URL Standard Standard (see "Internationalization and special characters"
[W3C-URL] provides guidance for URLs found in context of a web (Section 4.8.3) of [WHATWG-URL]) provides guidance for URLs found in
browser. the context of a web browser.
1.7. Validating JSContact 1.7. Validating JSContact
This specification distinguishes between three kinds of properties This specification distinguishes between three kinds of properties
regarding validation: IANA-registered properties and unknown regarding validation: IANA-registered properties and unknown
properties are defined in this section, while vendor-specific properties, which are defined in this section, and vendor-specific
properties are defined in Section 1.8.1. A JSContact object is properties, which are defined in Section 1.8.1. A JSContact object
invalid if any of its properties are invalid. is invalid if any of its properties are invalid.
This document defines for each property if it is mandatory or This document defines whether each property is mandatory or optional.
optional. A mandatory property MUST be present for a JSContact A mandatory property MUST be present for a JSContact object to be
object to be valid. An optional property does not need to be valid. An optional property does not need to be present. The values
present. The values of both required and optional properties MUST of both required and optional properties MUST adhere to the data type
adhere to the data type and definition of that property. and definition of that property.
1.7.1. Case-Sensitivity 1.7.1. Case-Sensitivity
All property names, object type names and enumerated values are case- All property names, object type names, and enumerated values are
sensitive, if not explicitly stated otherwise in their according case-sensitive, unless explicitly stated otherwise in their
definition. Implementations MUST handle a JSContact object as definitions. Implementations MUST handle a JSContact object as
invalid if a type name, property name or enumerated value only invalid if a type name, property name, or enumerated value only
differs in case from one defined for any JSContact version known to differs in case from one defined for any JSContact version known to
that implementation. This applies regardless of what JSContact that implementation. This applies regardless of what JSContact
version the Card object defines in its version (Section 2.1.2) version the Card object defines in its version (Section 2.1.2)
property. Section 1.7.3 defines how to handle unknown properties. property. Section 1.7.3 defines how to handle unknown properties.
1.7.2. IANA-registered Properties 1.7.2. IANA-Registered Properties
An IANA-registered property is any property that has been registered An IANA-registered property is any property that has been registered
according to the IANA property registry rules as outlined in according to the IANA property registry rules as outlined in
Section 3. All properties defined in this specification, including Section 3. All properties defined in this specification, including
their object value types and enumerated values, are registered at their object value types and enumerated values, are registered at
IANA. IANA.
Implementations MUST validate IANA-registered properties in JSContact Implementations MUST validate IANA-registered properties in JSContact
data, unless they are unknown to the implementation (see data, unless they are unknown to the implementation (Section 1.7.3).
Section 1.7.3). They MUST reject invalid IANA-registered properties. They MUST reject invalid IANA-registered properties. A property is
A property is invalid if its name matches the name of an IANA- invalid if its name matches the name of an IANA-registered property
registered property but the value violates its definition according but the value violates its definition according to the JSContact
to the JSContact specification version defined in the Card version specification version defined in the Card version (Section 2.1.2)
property (Section 2.1.2). property.
IANA-registered property names MUST NOT contain US-ASCII control IANA-registered property names MUST NOT contain US-ASCII control
characters (U+0000 to U+001F, U+007F), the COLON (U+003A) or characters (U+0000 to U+001F, U+007F), the COLON (U+003A), or the
QUOTATION MARK (U+0022) characters. They MUST only contain US-ASCII QUOTATION MARK (U+0022). They MUST only contain US-ASCII
alphanumeric characters that match the ALPHA and DIGIT rules defined alphanumeric characters that match the ALPHA and DIGIT rules defined
in Appendix B.1 of [RFC5234]) or the COMMERCIAL AT (U+0040) in Appendix B.1 of [RFC5234] or the COMMERCIAL AT (U+0040) character.
character. IANA-registered property names MUST be notated in lower IANA-registered property names MUST be notated in lower camel case.
camel case.
1.7.3. Unknown Properties 1.7.3. Unknown Properties
Implementations may encounter JSContact data where a property name is Implementations may encounter JSContact data where a property name is
unknown to that implementation, but the name adheres to the syntactic unknown to that implementation but the name adheres to the syntactic
restrictions of IANA-registered property names. Implementations MUST restrictions of IANA-registered property names. Implementations MUST
make sure that such a name does not violate the case-sensitivity make sure that such a name does not violate the case-sensitivity
rules defined in Section 1.7.1. If the property name is valid, then rules defined in Section 1.7.1. If the property name is valid, then
implementations MUST NOT treat such properties as invalid. Instead, implementations MUST NOT treat such properties as invalid. Instead,
they MUST preserve them in the JSContact object. they MUST preserve them in the JSContact object.
Implementations that create or update JSContact data MUST only set Implementations that create or update JSContact data MUST only set
IANA-registered properties or vendor-specific properties. Preserving IANA-registered properties or vendor-specific properties. Preserving
properties that are unknown to the implementation, is to allow properties that are unknown to the implementation is to allow
applications and services to interoperate without data loss, even if applications and services to interoperate without data loss, even if
not all of them implement the same set of JSContact extensions. not all of them implement the same set of JSContact extensions.
1.7.4. Enumerated Values 1.7.4. Enumerated Values
Several properties in this document restrict their allowed values to Several properties in this document restrict their allowed values to
be from a list of String values. These values are case-sensitive. a list of String values. These values are case-sensitive. If not
If not noted otherwise for a specific property, the initial list of noted otherwise for a specific property, the initial list of values
values for such properties is registered at IANA in the JSContact for such properties is registered at IANA in the "JSContact Enum
Enum Values Registry (Section 3.7). Implementations MUST only set Values" registry (Section 3.7). Implementations MUST only set IANA-
IANA-registered or vendor-specific (Section 1.8.2) values for such registered or vendor-specific (Section 1.8.2) values for such
properties. properties.
1.8. Vendor-Specific Extensions 1.8. Vendor-Specific Extensions
Vendors may extend properties and values for experimentation or to Vendors may extend properties and values for experimentation or to
store contacts data that only is useful for a single service or store contacts data that is only useful for a single service or
application. Such extensions are not meant for interoperation. If application. Such extensions are not meant for interoperation. If,
instead interoperation is desired, vendors are strongly encouraged to instead, interoperation is desired, vendors are strongly encouraged
define and register new properties, types and values at IANA. to define and register new properties, types, and values at IANA as
Section 3 defines how to register new properties, types or values at defined in Section 3. Section 1.7.2 defines the naming conventions
IANA. Section 1.7.2 defines the naming conventions for IANA- for IANA-registered elements.
registered elements.
1.8.1. Vendor-specific Properties 1.8.1. Vendor-Specific Properties
Vendor-specific property names MUST start with a vendor-specific Vendor-specific property names MUST start with a vendor-specific
prefix followed by a name, as produced by the v-extension ABNF below. prefix followed by a name, as produced by the v-extension ABNF below.
The prefix and name together form the property name. The vendor- The prefix and name together form the property name. The vendor-
specific prefix MUST be a domain name under control of the service or specific prefix MUST be a domain name under control of the service or
application that sets the property, but it need not resolve in the application that sets the property, but it need not resolve in the
Domain Name System [RFC1034] and [RFC1035]. The prefix ietf.org and Domain Name System [RFC1034] [RFC1035]. The prefix ietf.org and its
its subdomain names are reserved for IETF specifications. The name subdomain names are reserved for IETF specifications. The name MUST
MUST NOT contain the TILDE (U+007E) and SOLIDUS (U+002F) characters, NOT contain the TILDE (U+007E) and SOLIDUS (U+002F) characters, as
as these require special-escaping when encoding a JSON Pointer these require special escaping when encoding a JSON Pointer [RFC6901]
[RFC6901] for that property. for that property.
Vendor-specific properties MAY be set in any JSContact object. Vendor-specific properties MAY be set in any JSContact object.
Implementations MUST preserve vendor-specific properties in JSContact Implementations MUST preserve vendor-specific properties in JSContact
data, irrespective if they know their use. They MUST NOT reject the data, irrespective if they know their use. They MUST NOT reject the
property value as invalid, unless they are in control of the vendor- property value as invalid, unless they are in control of the vendor-
specific property as outlined in the above paragraph. specific property as outlined in the above paragraph.
The ABNF rule v-extension formally defines valid vendor-specific The ABNF rule v-extension formally defines valid vendor-specific
property names. Note that the vendor prefix allows for more values property names. Note that the vendor prefix allows for more values
than are allowed as Internationalized Domain Names (IDN) [RFC8499]. than Internationalized Domain Names (IDNs) [RFC8499]; therefore,
This is to allow JSContact implementations simply validate property JSContact implementations can simply validate property names without
names without implementing the full set of rules that apply to domain implementing the full set of rules that apply to domain names.
names.
v-extension = v-prefix ":" v-name v-extension = v-prefix ":" v-name
v-prefix = v-label *("." v-label) v-prefix = v-label *("." v-label)
v-label = alnum-int / alnum-int *(alnum-int / "-") alnum-int v-label = alnum-int / alnum-int *(alnum-int / "-") alnum-int
alnum-int = ALPHA / DIGIT / NON-ASCII alnum-int = ALPHA / DIGIT / NON-ASCII
; see RFC 6350 Section 3.3 ; see RFC 6350, Section 3.3
v-name = 1*(WSP / "!" / %x23-2e / %x30-7d / NON-ASCII) v-name = 1*(WSP / "!" / %x23-2e / %x30-7d / NON-ASCII)
; any characters except CTLs, DQUOTE, SOLIDUS and TILDE ; any characters except CTLs, DQUOTE, SOLIDUS, and TILDE
Figure 2: ABNF rules for vendor-specific property names Figure 2: ABNF Rules for Vendor-Specific Property Names
The value of vendor-specific properties can be any valid JSON value, The value of vendor-specific properties can be any valid JSON value,
and naming restrictions do not apply to such values. Specifically, and naming restrictions do not apply to such values. Specifically,
if the property value is a JSON object then the keys of such objects if the property value is a JSON object, then the keys of such objects
need not be named as vendor-specific properties. The example in need not be named as vendor-specific properties, as illustrated in
Figure 3 illustrates this: Figure 3:
"example.com:foo": "bar", "example.com:foo": "bar",
"example.com:foo2": { "example.com:foo2": {
"bar": "baz" "bar": "baz"
} }
Figure 3: Examples of vendor-specific properties Figure 3: Examples of Vendor-Specific Properties
1.8.2. Vendor-specific Values 1.8.2. Vendor-Specific Values
Some JSContact IANA-registered properties allow their values to be Some JSContact IANA-registered properties allow their values to be
vendor-specific. One such example is the kind property vendor-specific. One such example is the kind (Section 2.1.4)
Section 2.1.4, which enumerates its standard values but also allows property, which enumerates its standard values but also allows for
for arbitrary vendor-specific values. Such vendor-specific values arbitrary vendor-specific values. Such vendor-specific values MUST
MUST be valid v-extension values as defined in Section 1.8.1. The be valid v-extension values as defined in Section 1.8.1. The example
example in Figure 4 illustrates this: in Figure 4 illustrates this:
"kind": "example.com:baz" "kind": "example.com:baz"
Figure 4: Example of a vendor-specific value Figure 4: Example of a Vendor-Specific Value
Vendors are strongly encouraged to specify a new standard value once Vendors are strongly encouraged to specify a new standard value once
a vendor-specific one turns out to be useful also for other systems. a vendor-specific one turns out to also be useful for other systems.
1.9. Versioning 1.9. Versioning
Every instance of a JSContact Card (Section 2) indicates which Every instance of a JSContact Card (Section 2) indicates which
JSContact version its IANA-registered properties and values are based JSContact version its IANA-registered properties and values are based
on. The version is indicated both in the version (Section 2.1.2) on. The version is indicated both in the version (Section 2.1.2)
property within the Card and in the version (Section 3.1) parameter property within the Card and in the version (Section 3.1) parameter
of the JSContact MIME content type. All IANA-registered elements of the JSContact MIME content type. All IANA-registered elements
indicate the version at which they got introduced or obsoleted. indicate the version at which they were introduced or obsoleted.
1.9.1. Version Format and Requirements 1.9.1. Version Format and Requirements
A JSContact version consists of a numeric major and minor version, A JSContact version consists of a numeric major and minor version,
separated by the FULL STOP character (U+002E). Later versions are separated by the FULL STOP character (U+002E). Later versions are
numerically higher than former versions, with the major version being numerically higher than former versions, with the major version being
more significant than the minor version. A version value is produced more significant than the minor version. A version value is produced
by the ABNF by the following ABNF:
jsversion = 1*DIGIT "." 1*DIGIT jsversion = 1*DIGIT "." 1*DIGIT
Figure 5
Differing major version values indicate substantial differences in Differing major version values indicate substantial differences in
JSContact semantics and format. Implementations MUST be prepared JSContact semantics and format. Implementations MUST be prepared for
that property definitions and other JSContact elements differ in a property definitions and other JSContact elements that differ in a
backwards-incompatible manner. backwards-incompatible manner.
Differing minor version values indicate additions that enrich Differing minor version values indicate additions that enrich
JSContact data, but do not introduce backwards-incompatible changes. JSContact data but do not introduce backwards-incompatible changes.
Typically, these are new property enum values or properties with Typically, these are new property enum values or properties with a
narrow semantic scope. A new minor version MUST NOT require narrow semantic scope. A new minor version MUST NOT require
implementations to change their processing of JSContact data. implementations to change their processing of JSContact data.
Changing the major version number resets the minor version number to Changing the major version number resets the minor version number to
zero. zero.
1.9.2. Current Version 1.9.2. Current Version
This specification registers JSContact version value 1.0 (Table 1). This specification registers JSContact version value 1.0 (Table 1).
2. Card 2. Card
This section defines the JSContact object type Card. A Card stores This section defines the JSContact object type Card. A Card stores
contact information, typically that of a person, organization or contact information, typically that of a person, organization, or
company. company.
Its media type is defined in Section 3.1. Its media type is defined in Section 3.1.
Figure 5 basic Card for the person "John Doe". As the object is the Figure 6 shows a basic Card for the person "John Doe". As the object
topmost object in the JSON data it has the @type property set is the topmost object in the JSON data, it has the @type property set
according to the rules defined Section 1.3.4. according to the rules defined in Section 1.3.4.
{ {
"@type": "Card", "@type": "Card",
"version": "1.0", "version": "1.0",
"uid": "22B2C7DF-9120-4969-8460-05956FE6B065", "uid": "22B2C7DF-9120-4969-8460-05956FE6B065",
"kind": "individual", "kind": "individual",
"name": { "name": {
"components": [ "components": [
{ "kind": "given", "value": "John" }, { "kind": "given", "value": "John" },
{ "kind": "surname", "value": "Doe" } { "kind": "surname", "value": "Doe" }
], ],
"isOrdered": true "isOrdered": true
} }
} }
Figure 5: Example of a basic Card Figure 6: Example of a Basic Card
2.1. Metadata Properties 2.1. Metadata Properties
This section defines properties about this instance of a Card, such This section defines properties about this instance of a Card such as
as its unique identifier, its creation date, how it relates to other its unique identifier, its creation date, and how it relates to other
Cards and other metadata information. Cards and other metadata information.
2.1.1. @type 2.1.1. @type
Type: String (mandatory). Type: String (mandatory)
This MUST be Card, if set. This MUST be Card, if set.
2.1.2. version 2.1.2. version
Type: String (mandatory). Type: String (mandatory)
Specifies the JSContact version used to define this Card. The value This specifies the JSContact version used to define the Card. The
MUST be one of the IANA-registered JSContact Enum Values for the value MUST be one of the IANA-registered JSContact Enum Values for
version property. Also see Section 1.9.2. the version property. Also see Section 1.9.2.
"version": "1.0" "version": "1.0"
Figure 6: version example Figure 7: version Example
2.1.3. created 2.1.3. created
Type: UTCDateTime (optional). Type: UTCDateTime (optional)
The date and time when this Card was created. The date and time when the Card was created.
"created": "2022-09-30T14:35:10Z" "created": "2022-09-30T14:35:10Z"
Figure 7: created example
Figure 8: created Example
2.1.4. kind 2.1.4. kind
Type: String (optional, default: individual). The kind of the entity Type: String (optional; default: individual)
the Card represents.
The kind of the entity the Card represents.
The enumerated (Section 1.7.4) values are: The enumerated (Section 1.7.4) values are:
* individual: a single person * individual: a single person
* group: a group person of persons or entities * group: a group of people or entities
* org: an organization * org: an organization
* location: a named location * location: a named location
* device: a device, such as appliances, computers, or network * device: a device such as an appliance, a computer, or a network
elements element
* application: a software application * application: a software application
"kind": "individual" "kind": "individual"
Figure 8: kind example Figure 9: kind Example
2.1.5. language 2.1.5. language
Type: String (optional). Type: String (optional)
This is the language tag, as defined in [RFC5646], that best This is the language tag, as defined in [RFC5646], that best
describes the language used for text in the Card, optionally describes the language used for text in the Card, optionally
including additional information such as the script. Note that including additional information such as the script. Note that
values MAY be localized in the localizations property Section 2.7.1. values MAY be localized in the localizations (Section 2.7.1)
property.
"language": "de-AT" "language": "de-AT"
Figure 9: language example Figure 10: language Example
2.1.6. members 2.1.6. members
Type: String[Boolean] (optional). Type: String[Boolean] (optional)
This identifies the set of Cards that are members of this group Card. This identifies the set of Cards that are members of this group Card.
Each key in the set is the uid property value of the member, each Each key in the set is the uid property value of the member, and each
boolean value MUST be true. If this property is set, then the value boolean value MUST be true. If this property is set, then the value
of the kind property MUST be group. of the kind property MUST be group.
The opposite is not true. A group Card will usually contain the The opposite is not true. A group Card will usually contain the
members property to specify the members of the group, but it is not members property to specify the members of the group, but it is not
required to. A group Card without the members property can be required to. A group Card without the members property can be
considered an abstract grouping, or one whose members are known considered an abstract grouping or one whose members are known
empirically (e.g., "IETF Participants"). empirically (e.g., "IETF Participants").
"kind": "group", "kind": "group",
"name": { "name": {
"full": "The Doe family" "full": "The Doe family"
}, },
"uid": "urn:uuid:ab4310aa-fa43-11e9-8f0b-362b9e155667", "uid": "urn:uuid:ab4310aa-fa43-11e9-8f0b-362b9e155667",
"members": { "members": {
"urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af": true, "urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af": true,
"urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519": true "urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519": true
} }
Figure 10: members example Figure 11: members Example
2.1.7. prodId 2.1.7. prodId
Type: String (optional). Type: String (optional)
The identifier for the product that created the Card. If set, the The identifier for the product that created the Card. If set, the
value MUST be at least one character long. value MUST be at least one character long.
"prodId": "ACME Contacts App version 1.23.5" "prodId": "ACME Contacts App version 1.23.5"
Figure 11: prodId example Figure 12: prodId Example
2.1.8. relatedTo 2.1.8. relatedTo
Type: String[Relation] (optional). Type: String[Relation] (optional)
Relates the object to other Cards. This is represented as a map, This relates the object to other Cards. It is represented as a map,
where each key is the uid of the related Card and the value defines where each key is the uid of the related Card, and the value defines
the relation. The Relation object has the following properties: the relation. The Relation object has the following properties:
* @type: String. This MUST be Relation, if set. @type: String. This MUST be Relation, if set.
* relation: String[Boolean] (optional, default: empty Object) relation: String[Boolean] (optional; default: empty Object).
Describes how the linked object is related to the linking object. Describes how the linked object is related to the linking object.
The relation is defined as a set of relation types. The key in The relation is defined as a set of relation types. The key in
the set defines the relation type, the value for each key in the the set defines the relation type; the value for each key in the
set MUST be true. The relationship between the two objects is set MUST be true. The relationship between the two objects is
undefined if the set is empty. undefined if the set is empty.
The initial list of enumerated (Section 1.7.4) relation types The initial list of enumerated (Section 1.7.4) relation types
matches the IANA-registered TYPE parameter [IANAvCard] values of matches the IANA-registered TYPE [IANA-vCard] parameter values of
the vCard RELATED property (Section 6.6.6 of [RFC6350]): the vCard RELATED property (Section 6.6.6 of [RFC6350]):
- acquaintance * acquaintance
- agent * agent
- child * child
- colleague * co-resident
- contact * co-worker
- co-resident * colleague
- co-worker * contact
- crush * crush
- date * date
- emergency * emergency
- friend * friend
- kin * kin
- me * me
- met * met
- muse * muse
- neighbor * neighbor
- parent * parent
- sibling * sibling
- spouse * spouse
- sweetheart * sweetheart
"relatedTo": { "relatedTo": {
"urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6": { "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6": {
"relation": { "relation": {
"friend": true "friend": true
} }
}, },
"8cacdfb7d1ffdb59@example.com": { "8cacdfb7d1ffdb59@example.com": {
"relation": {} "relation": {}
} }
} }
Figure 12: relatedTo example Figure 13: relatedTo Example
2.1.9. uid 2.1.9. uid
Type: String (mandatory). Type: String (mandatory)
An identifier, used to associate the object as the same across An identifier that is used to associate the object as the same across
different systems, address books and views. The value SHOULD be a different systems, address books, and views. The value SHOULD be a
URN [RFC8141] but for compatibility with [RFC6350] it MAY also be a URN [RFC8141], but for compatibility with [RFC6350], it MAY also be a
URI [RFC3986] or free-text value. The value of the URN SHOULD be in URI [RFC3986] or free-text value. The value of the URN SHOULD be in
the uuid namespace [RFC4122]. As of this writing, a revision the uuid namespace [RFC4122]. As of this writing, a revision [UUID]
[I-D.ietf-uuidrev-rfc4122bis] of the UUID standard document is being of the Universally Unique Identifier (UUID) Standards Track document
worked on and is likely to introduce new UUID versions and best [RFC4122] is in progress and will likely introduce new UUID versions
practices to generate global unique identifiers. Implementors SHOULD and best practices to generate global unique identifiers.
follow any recommendations described there. Until then, Implementors SHOULD follow any recommendations described there.
implementations SHOULD generate identifiers using the random or Until then, implementations SHOULD generate identifiers using the
pseudo-random UUID version described in Section 4.4 of [RFC4122]. random or pseudorandom UUID version described in Section 4.4 of
[RFC4122].
"uid": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6" "uid": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
Figure 13: uid example Figure 14: uid Example
2.1.10. updated 2.1.10. updated
Type: UTCDateTime (optional). Type: UTCDateTime (optional)
The date and time when the data in this Card was last modified. The date and time when the data in the Card was last modified.
"updated": "2021-10-31T22:27:10Z" "updated": "2021-10-31T22:27:10Z"
Figure 14: updated example Figure 15: updated Example
2.2. Name and Organization Properties 2.2. Name and Organization Properties
This section defines properties that name the entity represented by This section defines properties that name the entity represented by
this Card, its related organizations and roles, as well as how to the Card and its related organizations and roles. It also describes
refer the entity represented by this Card in spoken or written how to refer to the entity represented by the Card in spoken or
language. written language.
2.2.1. name 2.2.1. name
Type: Name (optional). Type: Name (optional)
The name of the entity represented by this Card. This can be any The name of the entity represented by the Card. This can be any type
type of name, e.g., it can but need not be the legal name of a of name, e.g., it can, but need not, be the legal name of a person.
person.
2.2.1.1. Name object 2.2.1.1. Name Object
A Name object has the following properties A Name object has the following properties:
* @type: String. This MUST be Name, if set. @type: String. This MUST be Name, if set.
* components: NameComponent[] (optional). The components components: NameComponent[] (optional). The components
(Section 2.2.1.2) making up this name. This property MUST be set (Section 2.2.1.2) making up this name. This property MUST be set
if the full property is not set, otherwise it SHOULD be set. The if the full property is not set; otherwise, it SHOULD be set. The
component list MUST have at least one entry having a different component list MUST have at least one entry having a different
kind than separator. kind than separator.
Name components SHOULD be ordered such that their values joined as Name components SHOULD be ordered such that when their values are
a String produce a valid full name of this entity. If so, joined as a String, a valid full name of the entity is produced.
implementations MUST set the isOrdered property value to true. If so, implementations MUST set the isOrdered property value to
true.
If the name components are ordered, then the defaultSeparator If the name components are ordered, then the defaultSeparator
property and name components of kind separator give guidance on property and name components of kind separator give guidance on
what characters to insert between components, but implementations what characters to insert between components, but implementations
are free to choose any others. In lack of a separator, inserting are free to choose any others. When lacking a separator,
a single Space character in between name component values is a inserting a single space character in between the name component
good choice. values is a good choice.
If instead the name components follow no particular order, then If, instead, the name components follow no particular order, then
the isOrdered property value MUST be false, the components the isOrdered property value MUST be false, the components
property MUST NOT contain a NameComponent of kind separator and property MUST NOT contain a NameComponent of kind separator, and
the defaultSeparator property MUST NOT be set. the defaultSeparator property MUST NOT be set.
Figure 15 is an example for the name "Vincent van Gogh". Note how Figure 16 shows an example for the name "Vincent van Gogh". Note
a single name component value may consist of multiple words. how a single name component value may consist of multiple words.
Figure 16 illustrates a name with a second surname, such as a
Spanish name. Additional examples are shown in Figure 18 and
Figure 38.
"name": { "name": {
"components": [ "components": [
{ "kind": "given", "value": "Vincent" }, { "kind": "given", "value": "Vincent" },
{ "kind": "surname", "value": "van Gogh" } { "kind": "surname", "value": "van Gogh" }
], ],
"isOrdered": true "isOrdered": true
} }
Figure 15: Example for a surname with two words Figure 16: Example of a Surname with Two Words
Figure 17 illustrates a name with a second surname such as a
Spanish name. Additional examples are shown in Figures 19 and 39.
"name": { "name": {
"components": [ "components": [
{ "kind": "given", "value": "Diego" }, { "kind": "given", "value": "Diego" },
{ "kind": "surname", "value": "Rivera" }, { "kind": "surname", "value": "Rivera" },
{ "kind": "surname2", "value": "Barrientos" } { "kind": "surname2", "value": "Barrientos" }
], ],
"isOrdered": true "isOrdered": true
} }
Figure 16: Example for a second surname Figure 17: Example of a Second Surname
* isOrdered: Boolean (optional, default: false). This indicates if isOrdered: Boolean (optional; default: false). Indicates if the
the name component sequence in the components property is ordered. name component sequence in the components property is ordered.
* defaultSeparator: String (optional). The default separator to defaultSeparator: String (optional). The default separator to
insert between name component values when concatenating all name insert between name component values when concatenating all name
component values to a single String. Also see the definition of component values to a single String. Also see the definition of
the separator kind for the NameComponent object. This property the separator kind for the NameComponent (Section 2.2.1.2) object.
MUST NOT be set if the Name isOrdered property value is false or This property MUST NOT be set if the Name isOrdered property value
if the components property is not set. is false or if the components property is not set.
* full: String (optional). This is the full name representation of full: String (optional). The full name representation of the Name.
this Name. This property MUST be set if the components property This property MUST be set if the components property is not set.
is not set.
"full": "Mr. John Q. Public, Esq." "full": "Mr. John Q. Public, Esq."
Figure 17: full example Figure 18: full Example
* sortAs: String[String] (optional).
This defines how this name lexicographically sorts in relation to sortAs: String[String] (optional). Defines how the name
other names when compared by a name component type. The key in lexicographically sorts in relation to other names when compared
the map defines the name component type. The value for that key by a name component type. The key in the map defines the name
defines the verbatim string to compare when sorting by this name component type. The value for that key defines the verbatim
component type. Absence of a key indicates that this name string to compare when sorting by the name component type.
component type SHOULD NOT be considered during sort. Sorting by Absence of a key indicates that the name component type SHOULD NOT
that missing name component type or if the sortAs property is not be considered during sort. Sorting by that missing name component
set is implementation-specific. This property MUST NOT be set if type, or if the sortAs property is not set, is implementation-
the components property is not set. specific. This property MUST NOT be set if the components
property is not set.
Each key in the map MUST be a valid name component type value as Each key in the map MUST be a valid name component type value as
defined for the kind property of the NameComponent object (see defined for the kind property of the NameComponent object (see
below). For each key in the map there MUST exist at least one below). For each key in the map, there MUST exist at least one
NameComponent object having that type in the components property NameComponent object that has the type in the components property
of this name. of the name.
Figure 18 illustrates the use of sortAs. The property value Figure 19 illustrates the use of sortAs. The property value
indicates that the middle name followed by both surnames should be indicates that the middle name followed by both surnames should be
used when sorting this name by surname. The absence of the middle used when sorting the name by surname. The absence of middle
indicates that the middle name on its own should be disregarded indicates that the middle name on its own should be disregarded
during sort. Even though the name only contains one name during sort. Even though the name only contains one name
component for the given name, the sortAs property still explicitly component for the given name, the sortAs property still explicitly
defines how to sort by given name as otherwise sorting by it would defines how to sort by the given name; otherwise, sorting by it
be undefined. would be undefined.
* phoneticScript: String (optional). The script used in the value phoneticScript: String (optional). The script used in the value of
of the NameComponent phonetic property. Also see Section 1.5.5. the NameComponent phonetic property. See Section 1.5.5 for more
See Figure 19 for an example. information and Figure 20 for an example.
* phoneticSystem: String (optional). The phonetic system used in phoneticSystem: String (optional). The phonetic system used in the
the NameComponent phonetic property. Also see Section 1.5.5. See NameComponent phonetic property. See Section 1.5.5 for more
Figure 19 for an example. information and Figure 20 for an example.
"name": { "name": {
"components": [ "components": [
{ "kind": "given", "value": "Robert" }, { "kind": "given", "value": "Robert" },
{ "kind": "given2", "value": "Pau" }, { "kind": "given2", "value": "Pau" },
{ "kind": "surname", "value": "Shou Chang" } { "kind": "surname", "value": "Shou Chang" }
], ],
"sortAs": { "sortAs": {
"surname": "Pau Shou Chang", "surname": "Pau Shou Chang",
"given": "Robert" "given": "Robert"
}, },
"isOrdered": true "isOrdered": true
} }
Figure 18: Example for sortAs Figure 19: sortAs Example
{ {
"@type": "Card", "@type": "Card",
"language": "zh-Hant", "language": "zh-Hant",
"name": { "name": {
"components": [ "components": [
{ "kind": "surname", "value": "孫" }, { "kind": "surname", "value": "孫" },
{ "kind": "given", "value": "中山" }, { "kind": "given", "value": "中山" },
{ "kind": "given2", "value": "文" }, { "kind": "given2", "value": "文" },
{ "kind": "given2", "value": "逸仙" } { "kind": "given2", "value": "逸仙" }
skipping to change at page 28, line 28 skipping to change at line 1248
"name/phoneticSystem": "jyut", "name/phoneticSystem": "jyut",
"name/phoneticScript": "Latn", "name/phoneticScript": "Latn",
"name/components/0/phonetic": "syun1", "name/components/0/phonetic": "syun1",
"name/components/1/phonetic": "zung1saan1", "name/components/1/phonetic": "zung1saan1",
"name/components/2/phonetic": "man4", "name/components/2/phonetic": "man4",
"name/components/3/phonetic": "jat6sin1" "name/components/3/phonetic": "jat6sin1"
} }
} }
} }
Figure 19: Example for phonetic and localizations Figure 20: phonetic and localizations Example
2.2.1.2. NameComponent 2.2.1.2. NameComponent
A NameComponent object has the following properties: A NameComponent object has the following properties:
* @type: String. This MUST be NameComponent, if set. @type: String. This MUST be NameComponent, if set.
* value: String (mandatory). The value of this name component. value: String (mandatory). The value of the name component. This
This can be composed of one or multiple words, such as "Poe" or can be composed of one or multiple words such as "Poe" or "van
"van Gogh". Gogh".
* kind: String (mandatory). The kind of this name component. The kind: String (mandatory). The kind of the name component. The
enumerated (Section 1.7.4) values are: enumerated (Section 1.7.4) values are:
- title: an honorific title or prefix, e.g., "Mr", "Ms", "Dr". * title: an honorific title or prefix, e.g., "Mr.", "Ms.", or
"Dr.".
- given: a given name, also known as "first name", "personal * given: a given name, also known as "first name" or "personal
name". name".
- given2: a name that appears between the given and surname, such * given2: a name that appears between the given and surname such
as a middle name or patronymic name. as a middle name or patronymic name.
- surname: a surname, also known as "last name", "family name". * surname: a surname, also known as "last name" or "family name".
- surname2: a secondary surname (used in some cultures), also * surname2: a secondary surname (used in some cultures), also
known as "maternal surname". known as "maternal surname".
- credential: a credential, also known as "accreditation * credential: a credential, also known as "accreditation
qualifier" or "honorific suffix", e.g., "B.A.", "Esq.". qualifier" or "honorific suffix", e.g., "B.A.", "Esq.".
- generation: a generation marker or qualifier, e.g., “Jr.” or * generation: a generation marker or qualifier, e.g., "Jr." or
“III”. "III".
- separator: a formatting separator between two ordered name non- * separator: a formatting separator between two ordered name non-
separator components. The value property of the component separator components. The value property of the component
includes the verbatim separator, for example a hyphen character includes the verbatim separator, for example, a hyphen
or even an empty string. This value has higher precedence than character or even an empty string. This value has higher
the defaultSeparator property of the Name. Implementations precedence than the defaultSeparator property of the Name.
MUST NOT insert two consecutive separator components, instead Implementations MUST NOT insert two consecutive separator
they SHOULD insert a single separator component with the components; instead, they SHOULD insert a single separator
combined value. This component kind MUST NOT be set if the component with the combined value. This component kind MUST
Name isOrdered property value is false. NOT be set if the Name isOrdered property value is false.
* phonetic: String (optional). This defines how to pronounce this phonetic: String (optional). Defines how to pronounce the name
name component. If this property is set, then at least one of the component. If this property is set, then at least one of the Name
Name object phoneticSystem or phoneticScript properties MUST be object properties, phoneticSystem or phoneticScript, MUST be set.
set. Also see Section 1.5.5. Also see Section 1.5.5.
2.2.1.3. nicknames 2.2.1.3. nicknames
Type: Id[Nickname] (optional). Type: Id[Nickname] (optional)
The nicknames of the entity represented by this Card. A Nickname The nicknames of the entity represented by the Card. A Nickname
object has the following properties: object has the following properties:
* @type: String. This MUST be Nickname, if set. @type: String. This MUST be Nickname, if set.
* name: String (mandatory). The nickname. name: String (mandatory). The nickname.
* contexts: String[Boolean] (optional) The contexts in which to use contexts: String[Boolean] (optional). The contexts in which to use
this nickname. Also see Section 1.5.1. the nickname. Also see Section 1.5.1.
* pref: UnsignedInt (optional). The preference of this nickname in pref: UnsignedInt (optional). The preference of the nickname in
relation to other nicknames. Also see Section 1.5.4. relation to other nicknames. Also see Section 1.5.4.
"nicknames": { "nicknames": {
"k391": { "k391": {
"name": "Johnny" "name": "Johnny"
} }
} }
Figure 20: nicknames example Figure 21: nicknames Example
2.2.2. organizations 2.2.2. organizations
Type: Id[Organization] (optional). Type: Id[Organization] (optional)
The companies or organizations names and units associated with this The company or organization names and units associated with the Card.
Card. An Organization object has the following properties, of which An Organization object has the following properties, of which at
at least one of the name and units properties MUST be set: least one of the name and units properties MUST be set:
* @type: String. This MUST be Organization, if set. @type: String. This MUST be Organization, if set.
* name: String (optional). The name of this organization. name: String (optional). The name of the organization.
* units: OrgUnit[] (optional). A list of organizational units, units: OrgUnit[] (optional). A list of organizational units,
ordered descending by hierarchy (e.g., a geographic or functional ordered as descending by hierarchy (e.g., a geographic or
division sorts before a department within that division). If set, functional division sorts before a department within that
the list MUST contain at least one entry. division). If set, the list MUST contain at least one entry.
* sortAs: String (optional). This defines how this organization sortAs: String (optional). Defines how the organization name
name lexicographically sorts in relation to other organizations lexicographically sorts in relation to other organizations when
when compared by name. The value defines the verbatim string compared by the name. The value defines the verbatim string value
value to compare. In absence of this property, the name property to compare. In absence of this property, the name property value
value MAY be used for comparison. MAY be used for comparison.
* contexts: String[Boolean] (optional). The contexts in which contexts: String[Boolean] (optional). The contexts in which
association with this organization apply. For example, membership association with the organization apply. For example, membership
in a choir may only apply in a private context. Also see in a choir may only apply in a private context. Also see
Section 1.5.1. Section 1.5.1.
A OrgUnit object has the following properties: An OrgUnit object has the following properties:
* @type: String. This MUST be OrgUnit, if set. @type: String. This MUST be OrgUnit, if set.
* name: String (mandatory). The name of this organizational unit. name: String (mandatory). The name of the organizational unit.
* sortAs: String (optional). This defines how this organization sortAs: String (optional). Defines how the organization unit name
unit name lexicographically sorts in relation to other lexicographically sorts in relation to other organizational units
organizational units of the same level when compared by name. The of the same level when compared by the name. The level is defined
level is defined by the array index of this organizational unit in by the array index of the organizational unit in the units
the units property of the Organization object. The property value property of the Organization object. The property value defines
defines the verbatim string value to compare. In absence of this the verbatim string value to compare. In absence of this
property, the name property value MAY be used for comparison. property, the name property value MAY be used for comparison.
"organizations": { "organizations": {
"o1": { "o1": {
"name": "ABC, Inc.", "name": "ABC, Inc.",
"units": [ "units": [
{ "name": "North American Division" }, { "name": "North American Division" },
{ "name": "Marketing" } { "name": "Marketing" }
], ],
"sortAs": "ABC" "sortAs": "ABC"
} }
} }
Figure 21: organizations example Figure 22: organizations Example
2.2.3. speakToAs 2.2.3. speakToAs
Type: SpeakToAs (optional). Type: SpeakToAs (optional)
Provides information how to address, speak to or refer to the entity Provides information on how to address, speak to, or refer to the
that is represented by this Card. A SpeakToAs object has the entity that is represented by the Card. A SpeakToAs object has the
following properties, of which at least one of the grammaticalGender following properties, of which at least one of the grammaticalGender
and pronouns properties MUST be set: and pronouns properties MUST be set:
* @type: String. This MUST be SpeakToAs, if set. @type: String. This MUST be SpeakToAs, if set.
* grammaticalGender: String (optional). Defines which grammatical grammaticalGender: String (optional). Defines which grammatical
gender to use in salutations and other grammatical constructs. gender to use in salutations and other grammatical constructs.
For example, the German language distinguishes by grammatical For example, the German language distinguishes by grammatical
gender in salutations such as "Sehr geehrte" (feminine) and "Sehr gender in salutations such as "Sehr geehrte" (feminine) and "Sehr
geehrter" (masculine). The enumerated (Section 1.7.4) values are: geehrter" (masculine). The enumerated (Section 1.7.4) values are:
- animate * animate
* common
- common * feminine
* inanimate
- feminine * masculine
* neuter
- inanimate
- masculine
- neuter
Note that the grammatical gender does not allow inferring the Note that the grammatical gender does not allow inferring the
gender identities or assigned sex of the contact. gender identities or assigned sex of the contact.
* pronouns: Id[Pronouns] (optional). Defines the pronouns that the pronouns: Id[Pronouns] (optional). Defines the pronouns that the
contact chooses to use for themselves. contact chooses to use for themselves.
A Pronouns object has the following properties: A Pronouns object has the following properties:
* @type: String. This MUST be Pronouns, if set. @type: String. This MUST be Pronouns, if set.
* pronouns: String (mandatory). Defines the pronouns. Any value or pronouns: String (mandatory). Defines the pronouns. Any value or
form is allowed. Examples in English include she/her and form is allowed. Examples in English include she/her and
they/them/theirs. The value MAY be overridden in the they/them/theirs. The value MAY be overridden in the
localizations property (Section 2.7.1). localizations (Section 2.7.1) property.
* contexts: String[Boolean] (optional). The contexts in which to contexts: String[Boolean] (optional). The contexts in which to use
use these pronouns. Also see Section 1.5.1. the pronouns. Also see Section 1.5.1.
* pref: UnsignedInt (optional). The preference of these pronouns in pref: UnsignedInt (optional). The preference of the pronouns in
relation to other pronouns in the same context. Also see relation to other pronouns in the same context. Also see
Section 1.5.4. Section 1.5.4.
"speakToAs": { "speakToAs": {
"grammaticalGender": "neuter", "grammaticalGender": "neuter",
"pronouns": { "pronouns": {
"k19": { "k19": {
"pronouns": "they/them", "pronouns": "they/them",
"pref": 2 "pref": 2
}, },
"k32": { "k32": {
"pronouns": "xe/xir", "pronouns": "xe/xir",
"pref": 1 "pref": 1
} }
} }
} }
Figure 22: speakToAs example Figure 23: speakToAs Example
2.2.4. titles 2.2.4. titles
Type : Id[Title] (optional). Type: Id[Title] (optional)
The job titles or functional positions of the entity represented by The job titles or functional positions of the entity represented by
this Card. A Title object has the following properties: the Card. A Title object has the following properties:
* @type: String. This MUST be Title, if set. @type: String. This MUST be Title, if set.
* name: String (mandatory). The title or role name of the entity name: String (mandatory). The title or role name of the entity
represented by this Card. represented by the Card.
* kind: String (optional, default title). Describes the kind: String (optional; default: title). Describes the
organizational or situational kind of this title. Some organizational or situational kind of the title. Some
organizations and individuals distinguish between _titles_ as organizations and individuals distinguish between _titles_ as
organizational positions and _roles_ as more temporary organizational positions and _roles_ as more temporary assignments
assignments, such as in project management. such as in project management.
The enumerated (Section 1.7.4) values are: The enumerated (Section 1.7.4) values are:
- title * title
* role
- role
* organizationId: Id (optional). The identifier of the organization organizationId: Id (optional). The identifier of the organization
in which this title is held. in which this title is held.
"titles": { "titles": {
"le9": { "le9": {
"kind": "title", "kind": "title",
"name": "Research Scientist" "name": "Research Scientist"
}, },
"k2": { "k2": {
"kind": "role", "kind": "role",
"name": "Project Leader", "name": "Project Leader",
"organizationId": "o2" "organizationId": "o2"
} }
}, },
"organizations": { "organizations": {
"o2": { "o2": {
"name": "ABC, Inc." "name": "ABC, Inc."
} }
} }
Figure 23: titles example Figure 24: titles Example
2.3. Contact Properties 2.3. Contact Properties
This section defines properties how to contact the entity represented This section defines how properties contact the entity represented by
by this Card. the Card.
2.3.1. emails 2.3.1. emails
Type: Id[EmailAddress] (optional). Type: Id[EmailAddress] (optional)
The email addresses to contact the entity represented by this Card. The email addresses in which to contact the entity represented by the
An EmailAddress object has the following properties: Card. An EmailAddress object has the following properties:
* @type: String. This MUST be EmailAddress, if set. @type: String. This MUST be EmailAddress, if set.
* address: String (mandatory). The email address. This MUST be an address: String (mandatory). The email address. This MUST be an
_addr-spec_ value as defined in Section 3.4.1 of [RFC5322]. _addr-spec_ value as defined in Section 3.4.1 of [RFC5322].
* contexts: String[Boolean] (optional). The contexts in which to contexts: String[Boolean] (optional). The contexts in which to use
use this email address. Also see Section 1.5.1. this email address. Also see Section 1.5.1.
* pref: UnsignedInt (optional). The preference of this email pref: UnsignedInt (optional). The preference of the email address
address in relation to other email addresses. Also see in relation to other email addresses. Also see Section 1.5.4.
Section 1.5.4.
* label: String (optional). A custom label for the value, see label: String (optional). A custom label for the value. Also see
Section 1.5.3. Section 1.5.3.
"emails": { "emails": {
"e1": { "e1": {
"contexts": { "contexts": {
"work": true "work": true
}, },
"address": "jqpublic@xyz.example.com" "address": "jqpublic@xyz.example.com"
}, },
"e2": { "e2": {
"address": "jane_doe@example.com", "address": "jane_doe@example.com",
"pref": 1 "pref": 1
} }
} }
Figure 24: emails example Figure 25: emails Example
2.3.2. onlineServices 2.3.2. onlineServices
Type: Id[OnlineService] (optional). Type: Id[OnlineService] (optional)
The online services that are associated with the entity represented The online services that are associated with the entity represented
by this Card. This can be messaging services, social media profiles, by the Card. This can be messaging services, social media profiles,
and other. An OnlineService object has the following properties, of and other. An OnlineService object has the following properties, of
which at least the uri or user property MUST be set: which at least the uri or user property MUST be set:
* @type: String. This MUST be OnlineService, if set. @type: String. This MUST be OnlineService, if set.
* service: String (optional). The name of the online service or service: String (optional). The name of the online service or
protocol. The name MAY be capitalized the same as on the protocol. The name MAY be capitalized the same as on the
service's website, app or publishing material, but names MUST be service's website, app, or publishing material, but names MUST be
considered equal is they match case-insensitively. Examples are considered equal if they match case-insensitively. Examples are
GitHub, kakao, Mastodon. GitHub, Kakao, and Mastodon.
* uri: String (optional). This identifies the entity represented by uri: String (optional). Identifies the entity represented by the
this card at the online service. This MUST be a _URI_ as defined Card at the online service. This MUST be a _URI_ as defined in
in Section 3 of [RFC3986]. Section 3 of [RFC3986].
* user: String (optional). This names the entity represented by user: String (optional). Names the entity represented by the Card
this Card at the online service. Any free-text value is allowed. at the online service. Any free-text value is allowed. The
The service property SHOULD be set. service property SHOULD be set.
* contexts: String[Boolean] (optional). The contexts in which to contexts: String[Boolean] (optional). The contexts in which to use
use this service. Also see Section 1.5.1. the service. Also see Section 1.5.1.
* pref: UnsignedInt (optional). The preference of this service in pref: UnsignedInt (optional). The preference of the service in
relation to other services. Also see Section 1.5.4. relation to other services. Also see Section 1.5.4.
* label: String (optional). A custom label for the value, see label: String (optional). A custom label for the value. Also see
Section 1.5.3. Section 1.5.3.
"onlineServices": { "onlineServices": {
"x1": { "x1": {
"uri": "xmpp:alice@example.com" "uri": "xmpp:alice@example.com"
}, },
"x2": { "x2": {
"service": "Mastodon", "service": "Mastodon",
"user": "@alice@example2.com", "user": "@alice@example2.com",
"uri": "https://example2.com/@alice" "uri": "https://example2.com/@alice"
} }
} }
Figure 25: onlineServices example Figure 26: onlineServices Example
2.3.3. phones 2.3.3. phones
Type: Id[Phone] (optional). Type: Id[Phone] (optional)
The phone numbers to contact the entity represented by this Card. A The phone numbers in which to contact the entity represented by the
Phone object has the following properties: Card. A Phone object has the following properties:
* @type: String. This MUST be Phone, if set. @type: String. This MUST be Phone, if set.
* number: String (mandatory). The phone number, as either a URI or number: String (mandatory). The phone number as either a URI or
free-text. Typical URI schemes are the [RFC3966] tel or [RFC3261] free text. Typical URI schemes are tel [RFC3966] or sip
sip schemes, but any URI scheme is allowed. [RFC3261], but any URI scheme is allowed.
* features: String[Boolean] (optional). The set of contact features features: String[Boolean] (optional). The set of contact features
that this phone number may be used for. The set is represented as that the phone number may be used for. The set is represented as
an object, with each key being a method type. The boolean value an object, with each key being a method type. The boolean value
MUST be true. The enumerated (Section 1.7.4) method type values MUST be true. The enumerated (Section 1.7.4) method type values
are: are:
- mobile: the number is for a mobile phone. * mobile: the number for a mobile phone.
* voice: the number for calling by voice.
- voice: the number is for calling by voice. * text: the number that supports text messages (SMS).
* video: the number that supports video conferencing.
- text: the number supports text messages (SMS). * main-number: the main phone number such as the number of the
front desk at a company, as opposed to a direct-dial number of
- video: the number supports video conferencing. an individual employee.
* textphone: the number is for a device for people with hearing
- main-number: this number is the main phone number, such as the
number of the front-desk at a company, as opposed to a direct-
dial number of an individual employee.
- textphone: the number is for a device for people with hearing
or speech difficulties. or speech difficulties.
* fax: the number for sending faxes.
* pager: the number for a pager or beeper.
- fax: the number is for sending faxes. contexts: String[Boolean] (optional). The contexts in which to use
the number. Also see Section 1.5.1.
- pager: the number is for a pager or beeper.
* contexts: String[Boolean] (optional). The contexts in which to
use this number. Also see Section 1.5.1.
* pref: UnsignedInt (optional). The preference of this number in pref: UnsignedInt (optional). The preference of the number in
relation to other numbers. Also see Section 1.5.4. relation to other numbers. Also see Section 1.5.4.
* label: String (optional). A custom label for the value, see label: String (optional). A custom label for the value. Also see
Section 1.5.3. Section 1.5.3.
"phones": { "phones": {
"tel0": { "tel0": {
"contexts": { "contexts": {
"private": true "private": true
}, },
"features": { "features": {
"voice": true "voice": true
}, },
skipping to change at page 36, line 48 skipping to change at line 1632
"pref": 1 "pref": 1
}, },
"tel3": { "tel3": {
"contexts": { "contexts": {
"work": true "work": true
}, },
"number": "tel:+1-201-555-0123" "number": "tel:+1-201-555-0123"
} }
} }
Figure 26: phones example Figure 27: phones Example
2.3.4. preferredLanguages 2.3.4. preferredLanguages
Type : Id[LanguagePref] (optional). Type : Id[LanguagePref] (optional)
Defines the preferred languages for contacting the entity associated Defines the preferred languages for contacting the entity associated
with this Card. with the Card.
A LanguagePref object has the following properties: A LanguagePref object has the following properties:
* @type: String. This MUST be LanguagePref, if set. @type: String. This MUST be LanguagePref, if set.
* language: String (mandatory). The preferred language. This MUST language: String (mandatory). The preferred language. This MUST be
a language tag as defined in [RFC5646]. a language tag as defined in [RFC5646].
* contexts: String[Boolean] (optional). Defines the contexts in contexts: String[Boolean] (optional). Defines the contexts in which
which to use this language. Also see Section 1.5.1. to use the language. Also see Section 1.5.1.
* pref: UnsignedInt (optional). Defines the preference of this pref: UnsignedInt (optional). Defines the preference of the
language in relation to other languages of the same contexts. language in relation to other languages of the same contexts.
Also see Section 1.5.4. Also see Section 1.5.4.
"preferredLanguages": { "preferredLanguages": {
"l1": { "l1": {
"language": "en", "language": "en",
"contexts": { "contexts": {
"work": true "work": true
}, },
"pref": 1 "pref": 1
skipping to change at page 37, line 49 skipping to change at line 1678
"pref": 2 "pref": 2
}, },
"l3": { "l3": {
"language": "fr", "language": "fr",
"contexts": { "contexts": {
"private": true "private": true
} }
} }
} }
Figure 27: preferredLanguages example Figure 28: preferredLanguages Example
2.4. Calendaring and Scheduling Properties 2.4. Calendaring and Scheduling Properties
This section defines properties how to schedule calendar events with This section defines properties for scheduling calendar events with
the entity represented by this Card. the entity represented by the Card.
2.4.1. calendars 2.4.1. calendars
Type: Id[Calendar] (optional). Type: Id[Calendar] (optional)
These are resources for calendaring, such as calendars to lookup These are resources for calendaring such as using calendars to look
free-busy information for the entity represented by this Card. A up free-busy information for the entity represented by the Card. A
Calendar object has all properties of the Resource (Section 1.4.4) Calendar object has all properties of the Resource (Section 1.4.4)
data type, with the following additional definitions: data type, with the following additional definitions:
* The @type property value MUST be Calendar, if set. * The @type property value MUST be Calendar, if set.
* The kind property is mandatory. Its enumerated (Section 1.7.4) * The kind property is mandatory. Its enumerated (Section 1.7.4)
values are: values are:
- calendar: the resource is a calendar that contains entries such - calendar: The resource is a calendar that contains entries such
as calendar events or tasks. as calendar events or tasks.
- freeBusy: the resource allows for free-busy lookups, for - freeBusy: The resource allows for free-busy lookups, for
example to schedule group events. example, to schedule group events.
"calendars": { "calendars": {
"calA": { "calA": {
"kind": "calendar", "kind": "calendar",
"uri": "webcal://calendar.example.com/calA.ics" "uri": "webcal://calendar.example.com/calA.ics"
}, },
"project-a": { "project-a": {
"kind": "freeBusy", "kind": "freeBusy",
"uri": "https://calendar.example.com/busy/project-a" "uri": "https://calendar.example.com/busy/project-a"
} }
} }
Figure 28: calendars example Figure 29: calendars Example
2.4.2. schedulingAddresses 2.4.2. schedulingAddresses
Type: Id[SchedulingAddress] (optional). Type: Id[SchedulingAddress] (optional)
The scheduling addresses by which the entity may receive calendar The scheduling addresses by which the entity may receive calendar
scheduling invitations. A SchedulingAddress object has the following scheduling invitations. A SchedulingAddress object has the following
properties: properties:
* @type: String. This MUST be SchedulingAddress, if set. @type: String. This MUST be SchedulingAddress, if set.
* uri: String (mandatory). The address to use for calendar uri: String (mandatory). The address to use for calendar scheduling
scheduling with this contact. This MUST be a URI as defined in with the contact. This MUST be a URI as defined in Section 3 of
Section 3 of [RFC3986]. [RFC3986].
* contexts: String[Boolean] (optional). The contexts in which to contexts: String[Boolean] (optional). The contexts in which to use
use this scheduling address. Also see Section 1.5.1. the scheduling address. Also see Section 1.5.1.
* pref: UnsignedInt (optional). The preference of this scheduling pref: UnsignedInt (optional). The preference of the scheduling
address in relation to other scheduling address. Also see address in relation to other scheduling addresses. Also see
Section 1.5.4. Section 1.5.4.
* label: String (optional). A custom label for the scheduling label: String (optional). A custom label for the scheduling
address, see Section 1.5.3. address. Also see Section 1.5.3.
"schedulingAddresses": { "schedulingAddresses": {
"sched1": { "sched1": {
"uri": "mailto:janedoe@example.com" "uri": "mailto:janedoe@example.com"
} }
} }
Figure 29: schedulingAddresses example Figure 30: schedulingAddresses Example
2.5. Address and Location Properties 2.5. Address and Location Properties
This section defines properties for postal addresses and geographical This section defines properties for postal addresses and geographical
locations associated with the entity represented by this Card. locations associated with the entity represented by the Card.
2.5.1. addresses 2.5.1. addresses
Type: Id[Address] (optional). Type: Id[Address] (optional)
A map of address identifiers to Address objects, containing physical A map of address identifiers to Address objects, containing physical
locations. locations.
2.5.1.1. Address object 2.5.1.1. Address Object
An Address object has the following properties: An Address object has the following properties, of which at least one
of components, coordinates, countryCode, full or timeZone MUST be
set:
* @type: String. This MUST be Address, if set. @type: String. This MUST be Address, if set.
* components: AddressComponent[] (optional). The components components: AddressComponent[] (optional). The components
(Section 2.5.1.2) making up this address. This property MUST be (Section 2.5.1.2) that make up the address. The component list
set if the full property is not set, otherwise it SHOULD be set. MUST have at least one entry that has a kind other than separator.
The component list MUST have at least one entry having a different
kind than separator.
Address components SHOULD be ordered such that their values joined Address components SHOULD be ordered such that when their values
as a String produce a valid full address. If so, implementations are joined as a String, a valid full address is produced. If so,
MUST set the isOrdered property value to true. implementations MUST set the isOrdered property value to true.
If the address components are ordered, then the defaultSeparator If the address components are ordered, then the defaultSeparator
property and address components of kind separator give guidance property and address components of kind separator give guidance on
what characters to insert between components, but implementations what characters to insert between components, but implementations
are free to choose any others. In lack of a separator, inserting are free to choose any others. When lacking a separator,
a single Space character in between address component values is a inserting a single space character in between address component
good choice. values is a good choice.
If instead the address components follow no particular order, then If, instead, the address components follow no particular order,
the isOrdered property value MUST be false, the components then the isOrdered property value MUST be false, the components
property MUST NOT contain a AddressComponent of kind separator and property MUST NOT contain an AddressComponent of kind separator,
the defaultSeparator property MUST NOT be set. and the defaultSeparator property MUST NOT be set.
* isOrdered: Boolean (optional, default: false). This indicates if isOrdered: Boolean (optional; default: false). Indicates if the
the address component sequence in the components property is address component sequence in the components property is ordered.
ordered.
* countryCode: String (optional). The Alpha-2 country code countryCode: String (optional). The Alpha-2 country code
[ISO.3166-1.2006]. [ISO.3166-1].
* coordinates: String (optional). A [RFC5870] "geo:" URI for the coordinates: String (optional). A "geo:" URI [RFC5870] for the
address. address.
* timeZone: String (optional). Identifies the time zone this timeZone: String (optional). Identifies the time zone the address
address is located in. This MUST be a time zone name registered is located in. This MUST be a time zone name registered in IANA's
in the IANA Time Zone Database [IANATZ]. Time Zone Database [IANA-TZ].
* contexts: String[Boolean] (optional). The contexts of the address contexts: String[Boolean] (optional). The contexts of the address
information. The boolean value MUST be true. In addition to the information. The boolean value MUST be true. In addition to the
common contexts (Section 1.5.1), allowed key values are: common contexts (Section 1.5.1), allowed key values are:
- billing: an address to be used for billing. * billing: an address to be used for billing.
* delivery: an address to be used for delivering physical items.
- delivery: an address to be used for delivering physical items.
* full: String (optional). This is the full address, including full: String (optional). The full address, including street,
street, region or country. The purpose of this property is to region, or country. The purpose of this property is to define an
define an address, even if the individual address components are address, even if the individual address components are not known.
not known. If the street property is set, the full property
SHOULD NOT be set.
* defaultSeparator: String (optional). The default separator to defaultSeparator: String (optional). The default separator to
insert between address component values when concatenating all insert between address component values when concatenating all
address component values to a single String. Also see the address component values to a single String. Also see the
definition of the separator kind for the AddressComponent object. definition of the separator kind for the AddressComponent
This property MUST NOT be set if the Address isOrdered property (Section 2.5.1.2) object. This property MUST NOT be set if the
value is false or if the components property is not set. Address isOrdered property value is false or if the components
property is not set.
* pref: UnsignedInt (optional). The preference of this address in pref: UnsignedInt (optional). The preference of the address in
relation to other addresses. Also see Section 1.5.4. relation to other addresses. Also see Section 1.5.4.
* phoneticScript: String (optional). The script used in the value phoneticScript: String (optional). The script used in the value of
of the AddressComponent phonetic property. Also see
Section 1.5.5.
* phoneticSystem: String (optional). The phonetic system used in
the AddressComponent phonetic property. Also see Section 1.5.5. the AddressComponent phonetic property. Also see Section 1.5.5.
phoneticSystem: String (optional). The phonetic system used in the
AddressComponent phonetic property. Also see Section 1.5.5.
The following example illustrates the use of the address property. The following example illustrates the use of the address property.
Additional examples are in Section 2.5.1.3. Additional examples are shown in Section 2.5.1.3.
"addresses": { "addresses": {
"k23": { "k23": {
"contexts": { "contexts": {
"work": true "work": true
}, },
"components": [ "components": [
{ "kind": "number", "value": "54321" }, { "kind": "number", "value": "54321" },
{ "kind": "separator", "value": " " }, { "kind": "separator", "value": " " },
{ "kind": "name", "value": "Oak St" }, { "kind": "name", "value": "Oak St" },
skipping to change at page 41, line 46 skipping to change at line 1855
{ "kind": "separator", "value": " " }, { "kind": "separator", "value": " " },
{ "kind": "postcode", "value": "20190" }, { "kind": "postcode", "value": "20190" },
{ "kind": "country", "value": "USA" } { "kind": "country", "value": "USA" }
], ],
"countryCode": "US", "countryCode": "US",
"defaultSeparator": ", ", "defaultSeparator": ", ",
"isOrdered": true "isOrdered": true
} }
} }
Figure 30: Example of the address "54321 Oak St, Reston, VA Figure 31: Example of the Address "54321 Oak St, Reston, VA
20190, USA" 20190, USA"
2.5.1.2. AddressComponent object 2.5.1.2. AddressComponent Object
An AddressComponent object has the following properties: An AddressComponent object has the following properties:
* @type: String. This MUST be AddressComponent, if set. @type: String. This MUST be AddressComponent, if set.
* value: String (mandatory). The value of this address component.
* kind: String (mandatory). The kind of this address component.
The enumerated (Section 1.7.4) values are:
- room: the room or suite number or identifier.
- apartment: the extension designation, such as apartment number value: String (mandatory). The value of the address component.
or unit or box number.
- floor: the floor or level this address is located on. kind: String (mandatory). The kind of the address component. The
enumerated (Section 1.7.4) values are:
- building: the building, tower, or condominium this address is * room: the room, suite number, or identifier.
* apartment: the extension designation such as the apartment
number, unit, or box number.
* floor: the floor or level the address is located on.
* building: the building, tower, or condominium the address is
located in. located in.
* number: the street number, e.g., "123". This value is not
- number: the street number, e.g., "123". This value is not restricted to numeric values and can include any value such as
restricted to numeric values, and can include any value such as number ranges ("112-10"), grid style ("39.2 RD"), alphanumerics
number ranges ("112–10"), grid style ("39.2 RD"), alphanumerics ("N6W23001"), or fractionals ("123 1/2").
("N6W23001") or fractionals ("123 1/2"). * name: the street name.
* block: the block name or number.
- name: the street name. * subdistrict: the subdistrict, ward, or other subunit of a
- block: the block name or number.
- subdistrict: the subdistrict, ward or other subunit of a
district. district.
* district: the district name.
- district: the district name. * locality: the municipality, city, town, village, post town, or
other locality.
- locality: the municipality, city, town, village, post-town, or * region: the administrative area such as province, state,
another locality. prefecture, county, or canton.
* postcode: the postal code, post code, ZIP code, or other short
- region: the administrative area, such as province, state,
prefecture, county, canton.
- postcode: the postal code, post code, ZIP code or other short
code associated with the address by the relevant country's code associated with the address by the relevant country's
postal system. postal system.
* country: the country name.
- country: the country name. * direction: the cardinal direction or quadrant, e.g., "north".
* landmark: the publicly known prominent feature that can
- direction: the Cardinal direction or quadrant, e.g., "North". substitute the street name and number, e.g., "White House" or
"Taj Mahal".
- landmark: the publicly known prominent feature that can * postOfficeBox: the post office box number or identifier.
substitute the street name and number, e.g., White House, Taj * separator: a formatting separator between two ordered address
Mahal.
- postOfficeBox: the post office box number or identifier.
- separator: a formatting separator between two ordered address
non-separator components. The value property of the component non-separator components. The value property of the component
includes the verbatim separator, for example a hyphen character includes the verbatim separator, for example, a hyphen
or even an empty string. This value has higher precedence than character or even an empty string. This value has higher
the defaultSeparator property of the Address. Implementations precedence than the defaultSeparator property of the Address.
MUST NOT insert two consecutive separator components, instead Implementations MUST NOT insert two consecutive separator
they SHOULD insert a single separator component with the components; instead, they SHOULD insert a single separator
combined value. This component kind MUST NOT be set if the component with the combined value. This component kind MUST
Address isOrdered property value is false. NOT be set if the Address isOrdered property value is false.
* phonetic: String (optional). This defines how to pronounce this phonetic: String (optional). Defines how to pronounce the name
name component. If this property is set, then at least one of the component. If this property is set, then at least one of the
Address object phoneticSystem or phoneticScript properties MUST be Address object phoneticSystem or phoneticScript properties MUST be
set. Also see Section 1.5.5. set. Also see Section 1.5.5.
2.5.1.3. Address examples 2.5.1.3. Address Examples
The following are examples of addresses, in addition to Figure 30. Examples of addresses are shown below; also see Figure 31.
"addresses": { "addresses": {
"k25": { "k25": {
"components": [ "components": [
{ "kind": "number", "value": "46" }, { "kind": "number", "value": "46" },
{ "kind": "name", "value": "1 Sukhumvit 51 Alley" }, { "kind": "name", "value": "1 Sukhumvit 51 Alley" },
{ "kind": "subdistrict", "value": "Khlong Tan Nuea" }, { "kind": "subdistrict", "value": "Khlong Tan Nuea" },
{ "kind": "district", "value": " Watthana" }, { "kind": "district", "value": " Watthana" },
{ "kind": "locality", "value": "Bangkok" }, { "kind": "locality", "value": "Bangkok" },
{ "kind": "country", "value": "Thailand" }, { "kind": "country", "value": "Thailand" },
{ "kind": "postcode", "value": "10110" } { "kind": "postcode", "value": "10110" }
], ],
"defaultSeparator": ", ", "defaultSeparator": ", ",
"isOrdered": true "isOrdered": true
} }
} }
Figure 31: Example of the address "46, 1 Sukhumvit 51 Alley, Figure 32: Example of the Address "46, 1 Sukhumvit 51 Alley,
Khlong Tan Nuea, Watthana, Bangkok 10110, Thailand" Khlong Tan Nuea, Watthana, Bangkok 10110, Thailand"
The following example illustrates the use of an address in Tokyo and
its localization (Section 2.7.1) in Japanese.
"addresses": { "addresses": {
"k26": { "k26": {
"components": [ "components": [
{ "kind": "block", "value": "2-7" }, { "kind": "block", "value": "2-7" },
{ "kind": "separator", "value": "-" }, { "kind": "separator", "value": "-" },
{ "kind": "number", "value": "2" }, { "kind": "number", "value": "2" },
{ "kind": "separator", "value": " " }, { "kind": "separator", "value": " " },
{ "kind": "district", "value": "Marunouchi" }, { "kind": "district", "value": "Marunouchi" },
{ "kind": "locality", "value": "Chiyoda-ku" }, { "kind": "locality", "value": "Chiyoda-ku" },
{ "kind": "region", "value": "Tokyo" }, { "kind": "region", "value": "Tokyo" },
skipping to change at page 44, line 42 skipping to change at line 1975
{ "kind": "number", "value": "2" }, { "kind": "number", "value": "2" },
{ "kind": "postcode", "value": "〒100-8994" } { "kind": "postcode", "value": "〒100-8994" }
], ],
"defaultSeparator": "", "defaultSeparator": "",
"full": "〒100-8994東京都千代田区丸ノ内2-7-2", "full": "〒100-8994東京都千代田区丸ノ内2-7-2",
"isOrdered": true "isOrdered": true
} }
} }
} }
Figure 32: Example of an address in Tokyo and its localization Figure 33: Example of an Address in Tokyo and Its Localization in
Section 2.7.1 in Japanese. Japanese
2.6. Resource Properties 2.6. Resource Properties
This section defines properties for digital resources associated with This section defines properties for digital resources associated with
the entity represented by this Card. the entity represented by the Card.
2.6.1. cryptoKeys 2.6.1. cryptoKeys
Type: Id[CryptoKey] (optional). Type: Id[CryptoKey] (optional)
These are cryptographic resources such as public keys and These are cryptographic resources such as public keys and
certificates associated with the entity represented by this Card. A certificates associated with the entity represented by the Card. A
CryptoKey object has all properties of the Resource (Section 1.4.4) CryptoKey object has all properties of the Resource (Section 1.4.4)
data type, with the following additional definitions: data type, with the following additional definition:
* The @type property value MUST be CryptoKey, if set. * The @type property value MUST be CryptoKey, if set.
The following example shows how refer to an external cryptographic The following example shows how to refer to an external cryptographic
resource. resource.
"cryptoKeys": { "cryptoKeys": {
"mykey1": { "mykey1": {
"uri": "https://www.example.com/keys/jdoe.cer" "uri": "https://www.example.com/keys/jdoe.cer"
} }
} }
Figure 33: cryptoKeys example with external data Figure 34: Example of cryptoKeys with External Data
The following example shows how to embed key data in the CryptoKey. The following example shows how to embed key data in the CryptoKey.
The key data is depicted in multiple lines only for demonstration The key data is depicted in multiple lines only for demonstration
purposes. purposes.
"cryptoKeys": { "cryptoKeys": {
"mykey2": { "mykey2": {
"uri": "data:application/pgp-keys;base64,LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtF "uri": "data:application/pgp-keys;base64,LS0tLS1CRUdJTiBSU0EgUFVC
WS0tLS0tCk1JSUJDZ0tDQVFFQSt4R1ovd2N6OXVnRnBQMDdOc3BvNlUxN2wwWWhGa TElDIEtFWS0tLS0tCk1JSUJDZ0tDQVFFQSt4R1ovd2N6OXVnRnBQMDdOc
UZweHhVNHBUazNMaWZ6OVIzenNJc3UKRVJ3dGE3K2ZXSWZ4T28yMDhldHQvamhza2 3BvNlUxN2wwWWhGaUZweHhVNHBUazNMaWZ6OVIzenNJc3UKRVJ3dGE3K2
lWb2RTRXQzUUJHaDRYQmlweVdvcEt3WjkzSEhhRFZaQUFMaS8yQQoreFRCdFdkRW8 ZXSWZ4T28yMDhldHQvamhza2lWb2RTRXQzUUJHaDRYQmlweVdvcEt3Wjk
3WEdVdWpLRHZDMi9hWkt1a2ZqcE9pVUk4QWhMQWZqbWxjRC9VWjFRUGgwbUhzZ2xS zSEhhRFZaQUFMaS8yQQoreFRCdFdkRW83WEdVdWpLRHZDMi9hWkt1a2Zq
TkNtcEN3Cm13U1hBOVZObWh6K1BpQitEbWw0V1duS1cvVkhvMnVqVFh4cTcrZWZNV cE9pVUk4QWhMQWZqbWxjRC9VWjFRUGgwbUhzZ2xSTkNtcEN3Cm13U1hBO
TRIMmZueTNTZTNLWU9zRlBGR1oxVE4KUVNZbEZ1U2hXckhQdGlMbVVkUG9QNkNWMm VZObWh6K1BpQitEbWw0V1duS1cvVkhvMnVqVFh4cTcrZWZNVTRIMmZueT
1NTDF0aytsN0RJSXFYclFoTFVLREFDZU01cm9NeDBrTGhVV0I4UAorMHVqMUNObE5 NTZTNLWU9zRlBGR1oxVE4KUVNZbEZ1U2hXckhQdGlMbVVkUG9QNkNWMm1
ONEpSWmxDN3hGZnFpTWJGUlU5WjRONll3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJM NTDF0aytsN0RJSXFYclFoTFVLREFDZU01cm9NeDBrTGhVV0I4UAorMHVq
SUMgS0VZLS0tLS0K" MUNObE5ONEpSWmxDN3hGZnFpTWJGUlU5WjRONll3SURBUUFCCi0tLS0tR
U5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
} }
} }
Figure 34: cryptoKeys example with embedded data Figure 35: Example of cryptoKeys with Embedded Data
2.6.2. directories 2.6.2. directories
Type: Id[Directory] (optional). Type: Id[Directory] (optional)
These are directory service resources, such as entries in a directory These are directory service resources such as entries in a directory
or organizational directories for lookup. A Directory object has all or organizational directories for lookup. A Directory object has all
properties of the Resource (Section 1.4.4) data type, with the properties of the Resource (Section 1.4.4) data type, with the
following additional definitions: following additional definitions:
* The @type property value MUST be Directory, if set. * The @type property value MUST be Directory, if set.
* The kind property is mandatory. Its enumerated (Section 1.7.4) * The kind property is mandatory. Its enumerated (Section 1.7.4)
values are: values are:
- directory: the resource is a directory service where the entity - directory: the resource is a directory service that the entity
represented by this Card is part of. This typically is an represented by the Card is a part of. This typically is an
organizational directory that also contains associated organizational directory that also contains associated
entities, e.g., co-workers and management in a company entities, e.g., co-workers and management in a company
directory. directory.
- entry: the resource is a directory entry of the entity - entry: the resource is a directory entry of the entity
represented by this Card. In contrast to the directory type, represented by the Card. In contrast to the directory type,
this is the specific URI for the entity _within_ a directory. this is the specific URI for the entity _within_ a directory.
In addition, the Directory object has the following property: In addition, the Directory object has the following property:
* listAs: UnsignedInt (optional). This defines the position of this listAs: UnsignedInt (optional). Defines the position of the
directory resource in the list of all Directory objects having the directory resource in the list of all Directory objects having the
same kind in this Card. If set, the listAs value MUST be higher same kind in the Card. If set, the listAs value MUST be higher
than zero. Multiple directory resources MAY have the same listAs than zero. Multiple directory resources MAY have the same listAs
property value, or none. Sorting such entries is implementation- property value or none. Sorting such entries is implementation-
specific. specific.
"directories": { "directories": {
"dir1": { "dir1": {
"kind": "entry", "kind": "entry",
"uri": "https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf" "uri": "https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf"
}, },
"dir2": { "dir2": {
"kind": "directory", "kind": "directory",
"uri": "ldap://ldap.example/o=Example%20Tech,ou=Engineering", "uri": "ldap://ldap.example/o=Example%20Tech,ou=Engineering",
"pref": 1 "pref": 1
} }
Figure 35: directories example Figure 36: directories Example
2.6.3. links 2.6.3. links
Type: Id[Link] (optional). Type: Id[Link] (optional)
These are links to resources that do not fit any of the other use- These are links to resources that do not fit any of the other use-
case specific resource properties. A Link object has all properties case-specific resource properties. A Link object has all properties
of the Resource (Section 1.4.4) data type, with the following of the Resource (Section 1.4.4) data type, with the following
additional definitions: additional definitions:
* The @type property value MUST be Link, if set. * The @type property value MUST be Link, if set.
* The kind property is optional. Its enumerated (Section 1.7.4) * The kind property is optional. Its enumerated (Section 1.7.4)
values are: values are:
- contact: the resource is a URI by which the entity represented - contact: the resource is a URI by which the entity represented
by this Card may be contacted, including web forms or other by the Card may be contacted; this includes web forms or other
media that require user interaction. media that require user interaction.
"links": { "links": {
"link3": { "link3": {
"kind": "contact", "kind": "contact",
"uri": "mailto:contact@example.com", "uri": "mailto:contact@example.com",
"pref": 1 "pref": 1
} }
} }
Figure 36: links example Figure 37: links Example
2.6.4. media 2.6.4. media
Type: Id[Media] (optional). Type: Id[Media] (optional)
These are media resources such as photographs, avatars, or sounds These are media resources such as photographs, avatars, or sounds
associated with the entity represented by this Card. A Media object that are associated with the entity represented by the Card. A Media
has all properties of the Resource (Section 1.4.4) data type, with object has all properties of the Resource (Section 1.4.4) data type,
the following additional definitions: with the following additional definitions:
* The @type property value MUST be Media, if set. * The @type property value MUST be Media, if set.
* The kind property is mandatory. Its enumerated (Section 1.7.4) * The kind property is mandatory. Its enumerated (Section 1.7.4)
values are: values are:
- photo: the resource is a photograph or avatar. - photo: the resource is a photograph or avatar.
- sound: the resource is audio media, e.g., to specify the proper - sound: the resource is audio media, e.g., to specify the proper
pronunciation of the name property contents. pronunciation of the name property contents.
- logo: the resource is a graphic image or logo associated with - logo: the resource is a graphic image or logo associated with
the entity represented by this Card. the entity represented by the Card.
"media": { "media": {
"res45": { "res45": {
"kind": "sound", "kind": "sound",
"uri": "CID:JOHNQ.part8.19960229T080000.xyzMail@example.com" "uri": "CID:JOHNQ.part8.19960229T080000.xyzMail@example.com"
}, },
"res47": { "res47": {
"kind": "logo", "kind": "logo",
"uri": "https://www.example.com/pub/logos/abccorp.jpg" "uri": "https://www.example.com/pub/logos/abccorp.jpg"
}, },
"res1": { "res1": {
"kind": "photo", "kind": "photo",
"uri": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4..." "uri": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4..."
} }
} }
Figure 37: media example Figure 38: media Example
2.7. Multilingual Properties 2.7. Multilingual Properties
This section defines properties how to localize the content of this This section defines properties for localizing the content of the
Card in human languages. Card in human languages.
2.7.1. localizations 2.7.1. localizations
Type: String[PatchObject] (optional). Type: String[PatchObject] (optional)
This localizes property values in this Card to languages other than This localizes property values to languages (other than the main
the main language. Localizations provide language-specific language) in the Card. Localizations provide language-specific
alternatives for existing property values and SHOULD NOT add new alternatives for existing property values and SHOULD NOT add new
properties. properties.
The keys in the localizations property object are language tags The keys in the localizations property object are language tags
[RFC5646]. The values are patch objects which localize the Card in [RFC5646]. The values are patch objects that localize the Card in
the respective language tag. The paths in the PatchObject are the respective language tag. The paths in the PatchObject are
relative to the Card that includes the localizations property. A relative to the Card that includes the localizations property. A
patch MUST NOT target the localizations property. patch MUST NOT target the localizations property.
Conceptually, a Card is localized as follows: Conceptually, a Card is localized as follows:
* Determine the language tag in which this Card should be localized * Determine the language tag in which the Card should be localized.
in.
* If the localizations property includes a key for that language, * If the localizations property includes a key for that language,
obtain the PatchObject value. If there is no such key, stop. obtain the PatchObject value. If there is no such key, stop.
* Create a copy of the Card, but do not copy the localizations * Create a copy of the Card, but do not copy the localizations
property. property.
* Apply all patches in the PatchObject to the copy of the Card. * Apply all patches in the PatchObject to the copy of the Card.
* Optionally, set the language property in the copy of the Card. * Optionally, set the language property in the copy of the Card.
* Use the patched copy of the Card as the localized variant of the * Use the patched copy of the Card as the localized variant of the
original Card. original Card.
A patch in the PatchObject may contain any value type. Its value A patch in the PatchObject may contain any value type. Its value
MUST be a valid value according to the definition of the patched MUST be a valid value according to the definition of the patched
property. property.
Figure 38 localizes the name property by completely replacing its Figure 39 localizes the name property by completely replacing its
contents in Ukrainian language with Cyrillic script. contents in Ukrainian language with Cyrillic script.
{ {
"name": { "name": {
"components": [ "components": [
{ "kind": "title", "value": "Mr." }, { "kind": "title", "value": "Mr." },
{ "kind": "given", "value": "Ivan" }, { "kind": "given", "value": "Ivan" },
{ "kind": "given2", "value": "Petrovich" }, { "kind": "given2", "value": "Petrovich" },
{ "kind": "surname", "value": "Vasiliev" } { "kind": "surname", "value": "Vasiliev" }
] ]
skipping to change at page 49, line 42 skipping to change at line 2207
{ "kind": "title", "value": "г-н" }, { "kind": "title", "value": "г-н" },
{ "kind": "given", "value": "Иван" }, { "kind": "given", "value": "Иван" },
{ "kind": "given2", "value": "Петрович" }, { "kind": "given2", "value": "Петрович" },
{ "kind": "surname", "value": "Васильев" } { "kind": "surname", "value": "Васильев" }
] ]
} }
} }
} }
} }
Figure 38: Example for localizing a top-level property Figure 39: Example of Localizing a Top-Level Property
Figure 39 localizes the title name by patching _inside_ the titles Figure 40 localizes the title name by patching _inside_ the titles
property. All properties but the name property in the Title object property. All properties, except the name property in the Title
are left as-is. object, are left as is.
"name": { "name": {
"full": "Gabriel García Márquez" "full": "Gabriel García Márquez"
}, },
"titles": { "titles": {
"t1": { "t1": {
"kind": "title", "kind": "title",
"name": "novelist" "name": "novelist"
} }
}, },
"localizations": { "localizations": {
"es": { "es": {
"titles/t1/name": "autor" "titles/t1/name": "autor"
} }
} }
Figure 39: Example for localizing a nested property Figure 40: Example of Localizing a Nested Property
2.8. Additional Properties 2.8. Additional Properties
This section defines properties for which none of the previous This section defines properties for which none of the previous
sections are appropriate. sections are appropriate.
2.8.1. anniversaries 2.8.1. anniversaries
Type : Id[Anniversary] (optional). Type: Id[Anniversary] (optional)
These are memorable dates and events for the entity represented by These are memorable dates and events for the entity represented by
this Card. An Anniversary object has the following properties: the Card. An Anniversary object has the following properties:
* @type: String. This MUST be Anniversary, if set.
* kind: String (mandatory). Specifies the kind of the anniversary.
The enumerated (Section 1.7.4) values are:
- birth: a birthday anniversary
- death: a deathday anniversary @type: String. This MUST be Anniversary, if set.
- wedding: a wedding day anniversary kind: String (mandatory). Specifies the kind of anniversary. The
enumerated (Section 1.7.4) values are:
* date: PartialDate|Timestamp (mandatory, defaultType: PartialDate). * birth: a birthday anniversary
* death: a deathday anniversary
* wedding: a wedding day anniversary
The date of this anniversary in the Gregorian calendar. This MUST date: PartialDate|Timestamp (mandatory; defaultType: PartialDate).
either be a whole or partial calendar date or a complete UTC The date of the anniversary in the Gregorian calendar. This MUST
be either a whole or partial calendar date or a complete UTC
timestamp (see the definition of the Timestamp and PartialDate timestamp (see the definition of the Timestamp and PartialDate
object types below). object types below).
* place: Address (optional). An address associated with this place: Address (optional). An address associated with this
anniversary, e.g., the place of birth or death. anniversary, e.g., the place of birth or death.
A PartialDate object represents a complete or partial calendar date A PartialDate object represents a complete or partial calendar date
in the Gregorian calendar. It represents either a complete date, or in the Gregorian calendar. It represents a complete date, a year, a
a year, or a month in a year, or a day in a month. It has the month in a year, or a day in a month. It has the following
following properties, of which at least year or month and day MUST be properties, of which at least year or month and day MUST be set:
set:
* @type: String. This MUST be PartialDate, if set. @type: String. This MUST be PartialDate, if set.
* year: UnsignedInt (optional). This is the calendar year. year: UnsignedInt (optional). The calendar year.
* month: UnsignedInt (optional). This is the calendar month, month: UnsignedInt (optional). The calendar month, represented as
represented as the integers 1 <= month <= 12. If this property is the integers 1 <= month <= 12. If this property is set, then
set then either year or day MUST be set. either year or day MUST be set.
* day: UnsignedInt (optional). This is the calendar month day, day: UnsignedInt (optional). The calendar month day, represented as
represented as the integers 1 <= day <= 31, depending on the the integers 1 <= day <= 31, depending on the validity within the
validity within the month and year. If this property is set then month and year. If this property is set, then month MUST be set.
month MUST be set.
* calendarScale: String (optional). This is the calendar system in calendarScale: String (optional). The calendar system in which this
which this date occurs, in lowercase. This MUST be either a CLDR- date occurs, in lowercase. This MUST be either a calendar system
registered calendar system name [RFC7529] or a vendor-specific name registered as a Common Locale Data Repository (CLDR)
value. The year, month and day still MUST be represented in the [RFC7529] or a vendor-specific value. The year, month, and day
Gregorian calendar. Note that the year property might be required still MUST be represented in the Gregorian calendar. Note that
to convert the date between the Gregorian calendar and the the year property might be required to convert the date between
respective calendar system. the Gregorian calendar and the respective calendar system.
A Timestamp object has the following properties: A Timestamp object has the following properties:
* @type: String. This MUST be Timestamp, if set. @type: String. This MUST be Timestamp, if set.
* utc: UTCDateTime (mandatory). Specifies the point in time in UTC utc: UTCDateTime (mandatory). Specifies the point in time in UTC
time. time.
Figure 40 illustrates anniversaries with partial dates and timestamp. Figure 41 illustrates anniversaries with partial dates and a
Note how the @type property is set for the Timestamp object value timestamp. Note how the @type property is set for the Timestamp
according to the rules defined Section 1.3.4. object value according to the rules defined in Section 1.3.4.
"anniversaries": { "anniversaries": {
"k8": { "k8": {
"kind": "birth", "kind": "birth",
"date": { "date": {
"year": 1953, "year": 1953,
"month": 4, "month": 4,
"day": 15 "day": 15
} }
}, },
skipping to change at page 52, line 26 skipping to change at line 2317
"date": { "date": {
"@type": "Timestamp", "@type": "Timestamp",
"utc": "2019-10-15T23:10:00Z" "utc": "2019-10-15T23:10:00Z"
}, },
"place": { "place": {
"full": "4445 Tree Street\nNew England, ND 58647\nUSA" "full": "4445 Tree Street\nNew England, ND 58647\nUSA"
} }
} }
} }
Figure 40: anniversaries example Figure 41: anniversaries Example
2.8.2. keywords 2.8.2. keywords
Type: String[Boolean] (optional). A set of free-text keywords, also Type: String[Boolean] (optional)
known as _tags_. The set is represented as an object, with each key
being a keyword. The boolean value MUST be true. A set of free-text keywords, also known as _tags_. The set is
represented as an object, with each key being a keyword. The boolean
value MUST be true.
"keywords": { "keywords": {
"internet": true, "internet": true,
"IETF": true "IETF": true
} }
Figure 41: keywords example Figure 42: keywords Example
2.8.3. notes 2.8.3. notes
Type: Id[Note] (optional). Type: Id[Note] (optional)
Free-text notes associated with this Card. A Note object has the Free-text notes that are associated with the Card. A Note object has
following properties: the following properties:
* @type: String. This MUST be Note, if set. @type: String. This MUST be Note, if set.
* note: String (mandatory). The free text value of this note. note: String (mandatory). The free-text value of this note.
* created: UTCDateTime (optional). The date and time when this note created: UTCDateTime (optional). The date and time when this note
was created. was created.
* author: Author (optional). The author of this note. author: Author (optional). The author of this note.
An Author object has the following properties, of which at least one An Author object has the following properties, of which at least one
other than @type MUST be set: property other than @type MUST be set:
* @type: String. This MUST be Author, if set. @type: String. This MUST be Author, if set.
* name: String (optional). The name of this author. name: String (optional). The name of this author.
* uri: String (optional). A URI value that identifies the author. uri: String (optional). A URI value that identifies the author.
"notes": { "notes": {
"n1": { "n1": {
"note": "Open office hours are 1600 to 1715 EST, Mon-Fri", "note": "Open office hours are 1600 to 1715 EST, Mon-Fri",
"created": "2022-11-23T15:01:32Z", "created": "2022-11-23T15:01:32Z",
"author": { "author": {
"name": "John" "name": "John"
} }
} }
} }
Figure 42: notes example Figure 43: notes Example
2.8.4. personalInfo 2.8.4. personalInfo
Type: Id[PersonalInfo] (optional). Type: Id[PersonalInfo] (optional)
Defines personal information about the entity represented by this Defines personal information about the entity represented by the
Card. A PersonalInfo object has the following properties: Card. A PersonalInfo object has the following properties:
* @type: String. This MUST be PersonalInfo, if set. @type: String. This MUST be PersonalInfo, if set.
* kind: String (mandatory). Specifies the kind of this personal kind: String (mandatory). Specifies the kind of personal
information. The enumerated (Section 1.7.4) values are: information. The enumerated (Section 1.7.4) values are:
- expertise: a field of expertise or credential * expertise: a field of expertise or a credential
- hobby: a hobby * hobby: a hobby
- interest: an interest * interest: an interest
* value: String (mandatory). The actual information. value: String (mandatory). The actual information.
* level: String (optional). Indicates the level of expertise, or level: String (optional). Indicates the level of expertise or
engagement in hobby or interest. The enumerated (Section 1.7.4) engagement in hobby or interest. The enumerated (Section 1.7.4)
values are: values are:
- high * high
- medium * medium
- low * low
* listAs: UnsignedInt (optional). This defines the position of this listAs: UnsignedInt (optional). Defines the position of the
personal information in the list of all PersonalInfo objects personal information in the list of all PersonalInfo objects that
having the same kind in this Card. If set, the listAs value MUST have the same kind in the Card. If set, the listAs value MUST be
be higher than zero. Multiple personal information entries MAY higher than zero. Multiple personal information entries MAY have
have the same listAs property value, or none. Sorting such the same listAs property value or none. Sorting such entries is
entries is implementation-specific. implementation-specific.
* label: String (optional). A custom label. See Section 1.5.3. label: String (optional). A custom label. See Section 1.5.3.
"personalInfo": { "personalInfo": {
"pi2": { "pi2": {
"kind": "expertise", "kind": "expertise",
"value": "chemistry", "value": "chemistry",
"level": "high" "level": "high"
}, },
"pi1": { "pi1": {
"kind": "hobby", "kind": "hobby",
"value": "reading", "value": "reading",
"level": "high" "level": "high"
}, },
"pi6": { "pi6": {
"kind": "interest", "kind": "interest",
"value": "r&b music", "value": "r&b music",
"level": "medium" "level": "medium"
} }
} }
Figure 43: personalInfo example Figure 44: personalInfo Example
3. IANA Considerations 3. IANA Considerations
3.1. Media Type Registration 3.1. Media Type Registration
[I-D.ietf-calext-jscontact] defines a media type for use with This document defines a media type for use with JSContact data
JSContact data formatted in JSON. formatted in JSON.
Type name: Type name: application
application
Subtype name: Subtype name: jscontact+json
jscontact+json
Required parameters: Required parameters: None
None
Optional parameters: Optional parameters: version
version This parameter conveys the version of the JSContact data
in the body part. It MUST NOT occur more than once. If this
parameter is set, then the values of all JSContact version
(Table 2) properties in the body part MUST match the parameter
value.
Encoding considerations: This parameter conveys the version of the JSContact data in the
This is the same as the encoding considerations of application/ body part. It MUST NOT occur more than once. If this parameter
json, as specified in Section 11 of [RFC8259]. is set, then the values of all JSContact version (Table 2)
properties in the body part MUST match the parameter value.
Security considerations: Encoding considerations: This is the same as the encoding
See Section 4 of [I-D.ietf-calext-jscontact]. considerations of application/json, as specified in Section 11 of
[RFC8259].
Interoperability considerations: Security considerations: See Section 4 of RFC 9553.
While JSContact is designed to avoid ambiguities as much as
possible, when converting objects from other contact formats to/
from JSContact, it is possible that differing representations for
the same logical data or ambiguities in interpretation might
arise. The semantic equivalence of two JSContact objects may be
determined differently by different applications, for example,
where URL values differ in case between the two objects.
Published specification: Interoperability considerations: While JSContact is designed to
TBD avoid ambiguities as much as possible, when converting objects
from other contact formats to/from JSContact, it is possible that
differing representations for the same logical data or ambiguities
in interpretation might arise. The semantic equivalence of two
JSContact objects may be determined differently by different
applications, for example, where URL values differ in case between
the two objects.
Applications that use this media type: Published specification: RFC 9553
Applications that currently make use of the text/vcard media type
can use this as an alternative.
Fragment identifier considerations: Applications that use this media type: Applications that currently
A JSON Pointer fragment identifier may be used, as defined in make use of the text/vCard media type can use this as an
[RFC6901], Section 6. alternative.
Fragment identifier considerations: A JSON Pointer fragment
identifier may be used, as defined in [RFC6901], Section 6.
Additional information: Additional information:
Magic number(s): N/A
Magic number(s): N/A
File extensions(s): N/A File extensions(s): N/A
Macintosh file type code(s): N/A Macintosh file type code(s): N/A
Person & email address to contact for further information: Person & email address to contact for further information:
calsify@ietf.org calsify@ietf.org
Intended usage: Intended usage: COMMON
COMMON
Restrictions on usage: Restrictions on usage: N/A
N/A
Author: Author: See the "Authors' Addresses" section of RFC 9553.
See the "Author's Address" section of [I-D.ietf-calext-jscontact].
Change controller: Change controller: IETF
IETF
3.2. Creation of the "JSContact" Registry Group 3.2. Creation of the JSContact Registry Group
IANA is asked to create the "JSContact" registry group. The new IANA has created the "JSContact" registry group. The new registry
registry definitions in the following sections all belong to that definitions in the following sections all belong to that group.
group.
3.3. Registry Policy and Change Procedures 3.3. Registry Policy and Change Procedures
Registry assignments that introduce backwards-incompatible Registry assignments that introduce backwards-incompatible
(Section 1.9) changes require the JSContact major version to change, (Section 1.9) changes require the JSContact major version to change;
other changes only require to change the minor version. The registry other changes only require a change to the minor version. The
policy for assignments that require the JSContact major version to registry policy for assignments that require the JSContact major
change is Standards Action ([RFC8126], Section 4.9). The registry version to change is Standards Action ([RFC8126], Section 4.9). The
policy for other assignments is Specification Required ([RFC8126], registry policy for other assignments is Specification Required
Section 4.6). ([RFC8126], Section 4.6).
The Designated Expert decides if a major or minor version change is The designated expert (DE) decides if a major or minor version change
required and assigns the new version to the Version Registry is required and assigns the new version to the "JSContact Version"
(Section 3.4). Version numbers increment by one, and a major version registry (Section 3.4). Version numbers increment by one, and a
change resets the minor version to zero. An assignment may apply major version change resets the minor version to zero. An assignment
multiple changes and to more than one registry at once, in which case may apply multiple changes and to more than one registry at once, in
a single version change is sufficient. If the registry policy is which case a single version change is sufficient. If the registry
Specification Required, then the Designated Expert may decide that it policy is Specification Required, then the DE may decide that it is
is enough to document the new assignment in the Description item of enough to document the new assignment in the Description item of the
the respective registry. respective registry.
A registration MUST have an intended usage of common, reserved, or A registration MUST have an intended usage of common, reserved, or
obsolete. obsolete.
* A common usage denotes an item with shared semantics and syntax * A common usage denotes an item with shared semantics and syntax
across systems. Up-to-date systems MUST expect such items to across systems. Up-to-date systems MUST expect such items to
occur in JSContact data. occur in JSContact data.
* A reserved usage reserves an item in the registry without * A reserved usage reserves an item in the registry without
assigning semantics to avoid name collisions with future assigning semantics to avoid name collisions with future
extensions or protocol use. extensions or protocol use. Implementations MUST NOT expect or
add items with such names outside the protocols or extensions that
use them; otherwise, any such JSContact data is invalid.
* An obsolete usage denotes an item that is no longer expected to be * An obsolete usage denotes an item that is no longer expected to be
added by up-to-date systems. A new assignment has probably been added by up-to-date systems. A new assignment has probably been
defined covering the obsolete item's semantics. defined, covering the obsolete item's semantics. Implementations
MUST expect such items to occur in JSContact data up to the "Until
Version" registry field, inclusively. They MUST NOT add such
items for any version after which the item got obsolete;
otherwise, any such JSContact data is invalid.
The intended usage of registry items may change between versions, but
the designated expert must carefully consider the impact on existing
implementations and standards before doing so.
The registration procedure is not a formal standards process but The registration procedure is not a formal standards process but
rather an administrative procedure intended to allow community rather an administrative procedure intended to allow community
comment and check whether it is coherent without excessive time comments and to check whether it is coherent without excessive time
delay. It is designed to encourage vendors to document and register delay. It is designed to encourage vendors to document and register
new items they add for use cases not covered by the original new items they add for use cases not covered by the original
specification, leading to increased interoperability. specification, leading to increased interoperability.
3.3.1. Preliminary Community Review 3.3.1. Preliminary Community Review
Notice of a potential new registration MUST be sent to the Calext Notice of a potential new registration MUST be sent to the Calext WG
mailing list <calsify@ietf.org> for review. This mailing list is mailing list <calsify@ietf.org> for review. This mailing list is
appropriate to solicit community feedback on a proposed registry appropriate for soliciting community feedback on a proposed registry
assignment. assignment.
The intent of the public posting to this list is to solicit comments The intent of the public posting to this list is to solicit comments
and feedback on the choice of the item name or value, the unambiguity and feedback on the choice of the item name or value, the unambiguity
of its description, and a review of any interoperability or security of its description, and a review of any interoperability or security
considerations. The submitter may submit a revised registration considerations. The submitter may submit a revised registration
proposal or abandon the registration completely at any time. proposal or abandon the registration completely at any time.
3.3.2. Submit Request to IANA 3.3.2. Submit Request to IANA
Registration requests can be sent to <iana@iana.org>. Registration requests can be sent to IANA <iana@iana.org>.
3.3.3. Designated Expert Review 3.3.3. Designated Expert Review
The primary concern of the designated expert (DE) is preventing name The primary concern of the DE is preventing name collisions and
collisions and encouraging the submitter to document security and encouraging the submitter to document security and privacy
privacy considerations. considerations.
A new type name, property name or enumerated value MUST NOT differ A new type name, property name, or enumerated value MUST NOT differ
only in case from an already registered name or value. only in case from an already-registered name or value.
For a common-use registration, the DE is expected to confirm that For a common-use registration, the DE is expected to confirm that
suitable documentation is available to ensure interoperability. The suitable documentation is available to ensure interoperability. The
DE should also verify that the new assignment does not conflict with DE should also verify that the new assignment does not conflict with
work that is active or already published within the IETF. work that is active or already published within the IETF.
The DE will either approve or deny the registration request and The DE will either approve or deny the registration request and
publish a notice of the decision to the Calext WG mailing list or its publish a notice of the decision to the Calext WG mailing list or its
successor, as well as inform IANA. A denial notice must be justified successor, as well as inform IANA. A denial notice must be justified
by an explanation, and, in the cases where it is possible, concrete by an explanation, and in the cases where it is possible, concrete
suggestions on how the request can be modified to become acceptable suggestions on how the request can be modified to become acceptable
should be provided. should be provided.
3.3.4. Change Procedures 3.3.4. Change Procedures
Once a JSContact registry group item has been published by IANA, the Once a JSContact registry group item has been published by IANA, the
change controller may request a change to its definition. The same Change Controller may request a change to its definition. The same
procedure that would be appropriate for the original registration procedure that would be appropriate for the original registration
request is used to process a change request. request is used to process a change request.
JSContact registrations dot not get deleted; instead, items that are JSContact registrations do not get deleted; instead, items that are
no longer believed appropriate for use are declared obsolete by a no longer believed appropriate for use are declared obsolete by a
change to their "intended usage" field; such items will be clearly change to their "Intended Usage" field; such items will be clearly
marked in the IANA registry. marked in the IANA registry.
Significant changes to a JSContact registry item's definition should Significant changes to a JSContact registry item's definition should
be requested only when there are serious omissions or errors in the be requested only when there are serious omissions or errors in the
published specification, as such changes may cause interoperability published specification, as such changes may cause interoperability
issues. When review is required, a change request may be denied if issues. When review is required, a change request may be denied if
it renders entities that were valid under the previous definition it renders entities that were valid under the previous definition
invalid under the new definition. invalid under the new definition.
3.4. Creation of the "JSContact Version" Registry 3.4. Creation of the JSContact Version Registry
IANA is asked to create the "JSContact Version" registry. The IANA has created the "JSContact Version" registry. The purpose of
purpose of this new registry is to define the allowed value range of this new registry is to define the allowed value range of JSContact
JSContact major and minor version numbers. major and minor version numbers.
The registry entries sort numerically ascending by the "Major The registry entries sort numerically in ascending order by the
Version" column. "Major Version" column.
The registry process is outlined in Section 3.3. The registry process is outlined in Section 3.3.
3.4.1. "JSContact Version" Registry Template 3.4.1. JSContact Version Registry Template
Major Version: This is the numeric value of a JSContact major Major Version: The numeric value of a JSContact major version
version number. It MUST be a positive integer. number. It MUST be a positive integer.
Highest Minor Version: This is the maximum numeric value of a Highest Minor Version: The maximum numeric value of a JSContact
JSContact minor version for the given major version. It MUST be minor version for the given major version. It MUST be zero or a
zero or a positive integer. All numbers less than or equal this positive integer. All numbers less than or equal to this value
value are valid minor version values for the given major version. are valid minor version values for the given major version.
3.4.2. Initial Contents for the "JSContact Version" Registry 3.4.2. Initial Contents of the JSContact Version Registry
The following table lists the initial valid major and minor version The following table lists the initial valid major and minor version
number ranges. number ranges.
+===============+=======================+ +===============+=======================+===========+
| Major Version | Highest Minor Version | | Major Version | Highest Minor Version | Reference |
+===============+=======================+ +===============+=======================+===========+
| 1 | 0 | | 1 | 0 | RFC 9553 |
+---------------+-----------------------+ +---------------+-----------------------+-----------+
Table 1: JSContact Versions Table 1: JSContact Version Registry
3.5. Creation of the "JSContact Properties" Registry 3.5. Creation of the JSContact Properties Registry
IANA is asked to create the "JSContact Properties" registry. The IANA has created the "JSContact Properties" registry. The purpose of
purpose of this new registry is to allow interoperability of this new registry is to allow interoperability of extensions to
extensions to JSContact objects JSContact objects.
The registry entries sort alphabetically ascending by the "Property The registry entries sort alphabetically in ascending order by the
Name" column first, "Property Context" second, "Since Version" third. following columns: "Property Name" first, "Property Context" second,
Equal entries sort in any order. and "Since Version" third. Equal entries sort in any order.
The registry process for a new property is outlined in Section 3.3. The registry process for a new property is outlined in Section 3.3.
3.5.1. "JSContact Properties" Registry Template 3.5.1. JSContact Properties Registry Template
Property Name: This is the name of the property. The property name
MUST NOT already be registered for any of the object types listed
in the "Property Context" field of this registration. Other
object types MAY already have registered a different property with
the same name; however, the same name MUST only be used when the
semantics are analogous.
Property Type: This is the type of this property, using type Property Name: The name of the property. The property name MUST NOT
signatures, as specified in Section 1.3.2. The property type MUST already be registered for any of the object types listed in the
be registered in the "JSContact Types" registry. "Property Context" field of this registration. Other object types
MAY have already registered a different property with the same
name; however, the same name MUST only be used when the semantics
are analogous.
Property Context: This is a comma-separated list of JSContact object Property Type: For properties with intended usage other than
types (Section 3.6.2) that contain this property. "reserved", this is the type of this property, using type
signatures as specified in Section 1.3.2. The property type MUST
be registered in the "JSContact Types" registry. For reserved
property names, the value MUST be the verbatim string "not
applicable".
Reference or Description: This is a brief description or RFC number Property Context: A comma-separated list of JSContact object types
and section reference where the property is specified (omitted for (Section 3.6.2) that contain the property. For reserved property
"reserved" property names). This must include references to all names, the value MAY be the verbatim string "not applicable".
RFC documents where this property is introduced or updated.
Intended Usage: This may be "common", "reserved", or "obsolete". Intended Usage: May be "common", "reserved", or "obsolete".
Since Version: This defines the JSContact version on which this Since Version: The JSContact version on which the property
property definition is based on. The version MUST be one of the definition is based. The version MUST be one of the allowed
allowed values of the version property in the JSContact Enum Value values of the version property in the "JSContact Enum Values"
registry (see Table 1). registry (see Table 1).
Until Version: This defines the JSContact version after which this Until Version: The JSContact version after which the property was
property got obsoleted and MUST NOT be used in later versions. obsoleted; therefore, it MUST NOT be used in later versions. The
The Until Version value either MUST NOT be set, or be one of the Until Version value either MUST NOT be set or MUST be one of the
allowed values of the version property in the JSContact Enum Value allowed values of the version property in the "JSContact Enum
registry (see Table 1). Values" registry (see Table 1).
Change Controller: This is who may request a change to this entry's Change Controller: This is who may request a change to the entry's
definition (IETF for RFCs from the IETF stream). definition (IETF for RFCs from the IETF stream).
3.5.2. Initial Contents for the "JSContact Properties" Registry Reference or Description: A brief description or RFC number and
section reference where the property is specified. This must
include references to all RFC documents where this property is
introduced or updated. For reserved property names, the reference
or description MAY be omitted.
3.5.2. Initial Contents of the JSContact Properties Registry
The following table lists the initial common usage entries of the The following table lists the initial common usage entries of the
"JSContact Properties" registry. The Since Version for all "JSContact Properties" registry. For all properties, the Since
properties is 1.0. The Until Version for all properties is not set. Version is 1.0, the Until Version is not set, the Change Controller
All RFC section references are for [I-D.ietf-calext-jscontact]. The is IETF, and RFC section references are for RFC 9553.
change controller for all these properties is IETF.
+===================+=====================+=========================+============+ +===================+=====================+==================+========+
|Property Name |Property Type |Property Context |Reference or| |Property Name |Property Type |Property Context |Ref |
| | | |Description | +===================+=====================+==================+========+
+===================+=====================+=========================+============+ |@type |String |Address, |Sections|
|@type |String |Address, |Section | | | |AddressComponent, |2.5.1, |
| | |AddressComponent, |2.5.1, | | | |Anniversary, |2.8.1, |
| | |Anniversary, Author, |Section | | | |Author, Card, |2.1.1, |
| | |Card, Calendar, |2.8.1, | | | |Calendar, |2.4.1, |
| | |CryptoKey, Directory, |Section | | | |CryptoKey, |2.6.1, |
| | |EmailAddress, |2.1.1, | | | |Directory, |2.6.2, |
| | |LanguagePref, Link, |Section | | | |EmailAddress, |2.3.1, |
| | |Media, Name, |2.4.1, | | | |LanguagePref, |2.3.4, |
| | |NameComponent, Nickname, |Section | | | |Link, Media, Name,|2.6.3, |
| | |Note, OnlineService, |2.6.1, | | | |NameComponent, |2.6.4, |
| | |Organization, OrgUnit, |Section | | | |Nickname, Note, |2.2.1, |
| | |PartialDate,PersonalInfo,|2.6.2, | | | |OnlineService, |2.2.1.3,|
| | |Phone, Pronouns, |Section | | | |Organization, |2.8.3, |
| | |Relation, |2.3.1, | | | |OrgUnit, |2.3.2, |
| | |SchedulingAddress, |Section | | | |PartialDate, |2.2.2, |
| | |SpeakToAs, Timestamp, |2.3.4, | | | |PersonalInfo, |2.8.4, |
| | |Title |Section | | | |Phone, Pronouns, |2.3.3, |
| | | |2.6.3, | | | |Relation, |2.2.3, |
| | | |Section | | | |SchedulingAddress,|2.1.8, |
| | | |2.6.4, | | | |SpeakToAs, |2.4.2, |
| | | |Section | | | |Timestamp, Title |2.2.4 |
| | | |2.2.1, | +-------------------+---------------------+------------------+--------+
| | | |Section | |address |String |EmailAddress |Section |
| | | |2.2.1.3, | | | | |2.3.1 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.3, | |addresses |Id[Address] |Card |Section |
| | | |Section | | | | |2.5.1 |
| | | |2.3.2, | +-------------------+---------------------+------------------+--------+
| | | |Section | |anniversaries |Id[Anniversary] |Card |Section |
| | | |2.2.2, | | | | |2.8.1 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.4, | |author |Author |Note |Section |
| | | |Section | | | | |2.8.3 |
| | | |2.3.3, | +-------------------+---------------------+------------------+--------+
| | | |Section | |calendars |Id[Calendar] |Card |Section |
| | | |2.2.3, | | | | |2.4.1 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.1.8, | |calendarScale |String |PartialDate |Section |
| | | |Section | | | | |2.8.1 |
| | | |2.4.2, | +-------------------+---------------------+------------------+--------+
| | | |Section | |components |AddressComponent[] |Address |Section |
| | | |2.2.4 | | | | |2.5.1 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|version |String |Card |Section | |components |NameComponent[] |Name |Section |
| | | |2.1.2 | | | | |2.2.1 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|address |String |EmailAddress |Section | |contexts |String[Boolean] |Address, Calendar,|Sections|
| | | |2.3.1 | | | |CryptoKey, |1.4.4, |
+-------------------+---------------------+-------------------------+------------+ | | |Directory, |1.5.1, |
|addresses |Id[Address] |Card |Section | | | |EmailAddress, |2.5.1, |
| | | |2.5.1 | | | |LanguagePref, |2.4.1, |
+-------------------+---------------------+-------------------------+------------+ | | |Link, Media, |2.6.1, |
|anniversaries |Id[Anniversary] |Card |Section | | | |Nickname, |2.6.2, |
| | | |2.8.1 | | | |OnlineService, |2.3.1, |
+-------------------+---------------------+-------------------------+------------+ | | |Organization, |2.3.4, |
|author |Author |Note |Section | | | |Phone, Pronouns, |2.6.3, |
| | | |2.8.3 | | | |SchedulingAddress |2.6.4, |
+-------------------+---------------------+-------------------------+------------+ | | | |2.2.1.3,|
|calendars |Id[Calendar] |Card |Section | | | | |2.3.2, |
| | | |2.4.1 | | | | |2.2.2, |
+-------------------+---------------------+-------------------------+------------+ | | | |2.3.3, |
|calendarScale |String |PartialDate |Section | | | | |2.2.3, |
| | | |2.8.1 | | | | |2.4.2 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|components |AddressComponent[] |Address |Section | |coordinates |String |Address |Section |
| | | |2.5.1 | | | | |2.5.1 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|components |NameComponent[] |Name |Section | |countryCode |String |Address |Section |
| | | |2.2.1 | | | | |2.5.1 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|contexts |String[Boolean] |Address, Calendar, |Section | |created |UTCDateTime |Card, Note |Sections|
| | |CryptoKey, Directory, |1.5.1, | | | | |2.1.3, |
| | |EmailAddress, |Section | | | | |2.8.3 |
| | |LanguagePref, Link, |2.5.1, | +-------------------+---------------------+------------------+--------+
| | |Media, Nickname, |Section | |date |PartialDate|Timestamp|Anniversary |Section |
| | |OnlineService, |2.4.1, | | | | |2.8.1 |
| | |Organization, Phone, |Section | +-------------------+---------------------+------------------+--------+
| | |Pronouns, |2.6.1, | |day |UnsignedInt |PartialDate |Section |
| | |SchedulingAddress |Section | | | | |2.8.1 |
| | | |2.6.2, | +-------------------+---------------------+------------------+--------+
| | | |Section | |defaultSeparator |String |Address, Name |Sections|
| | | |2.3.1, | | | | |2.5.1, |
| | | |Section | | | | |2.2.1 |
| | | |2.3.4, | +-------------------+---------------------+------------------+--------+
| | | |Section | |directories |Id[Directory] |Card |Section |
| | | |2.6.3, | | | | |2.6.2 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.6.4, | |emails |Id[EmailAddress] |Card |Section |
| | | |Section | | | | |2.3.1 |
| | | |2.2.1.3, | +-------------------+---------------------+------------------+--------+
| | | |Section | |features |String[Boolean] |Phone |Section |
| | | |2.3.2, | | | | |2.3.3 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.2, | |full |String |Address, Name |Sections|
| | | |Section | | | | |2.5.1, |
| | | |2.3.3, | | | | |2.2.1 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.3, | |grammaticalGender |String |SpeakToAs |Section |
| | | |Section | | | | |2.2.3 |
| | | |2.4.2Section| +-------------------+---------------------+------------------+--------+
| | | |1.4.4 | |isOrdered |Boolean |Address, Name |Sections|
+-------------------+---------------------+-------------------------+------------+ | | | |2.5.1, |
|coordinates |String |Address |Section | | | | |2.2.1 |
| | | |2.5.1 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |keywords |String[Boolean] |Card |Section |
|countryCode |String |Address |Section | | | | |2.8.2 |
| | | |2.5.1 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |kind |String |AddressComponent, |Sections|
|created |UTCDateTime |Card, Note |Section | | | |Anniversary, |2.5.1, |
| | | |2.1.3, | | | |Calendar, Card, |2.8.1, |
| | | |Section | | | |CryptoKey, |2.4.1, |
| | | |2.8.3 | | | |Directory, Link, |2.1.4, |
+-------------------+---------------------+-------------------------+------------+ | | |Media, |2.6.1, |
|date |PartialDate|Timestamp|Anniversary |Section | | | |NameComponent, |2.6.2, |
| | | |2.8.1 | | | |PersonalInfo, |2.6.3, |
+-------------------+---------------------+-------------------------+------------+ | | |Title |2.6.4, |
|day |UnsignedInt |PartialDate |Section | | | | |2.2.1, |
| | | |2.8.1 | | | | |2.8.4, |
+-------------------+---------------------+-------------------------+------------+ | | | |2.2.4 |
|defaultSeparator |String |Address, Name |Section | +-------------------+---------------------+------------------+--------+
| | | |2.5.1, | |label |String |Calendar, |Sections|
| | | |Section | | | |CryptoKey, |1.4.4, |
| | | |2.2.1 | | | |Directory, |1.5.3, |
+-------------------+---------------------+-------------------------+------------+ | | |EmailAddress, |2.4.1, |
|directories |Id[Directory] |Card |Section | | | |Link, Media, |2.6.1, |
| | | |2.6.2 | | | |OnlineService, |2.6.2, |
+-------------------+---------------------+-------------------------+------------+ | | |PersonalInfo, |2.3.1, |
|emails |Id[EmailAddress] |Card |Section | | | |Phone, |2.6.3, |
| | | |2.3.1 | | | |SchedulingAddress |2.6.4, |
+-------------------+---------------------+-------------------------+------------+ | | | |2.3.2, |
|features |String[Boolean] |Phone |Section | | | | |2.8.4, |
| | | |2.3.3 | | | | |2.3.3, |
+-------------------+---------------------+-------------------------+------------+ | | | |2.4.2 |
|full |String |Address, Name |Section | +-------------------+---------------------+------------------+--------+
| | | |2.5.1, | |language |String |Card, LanguagePref|Sections|
| | | |Section | | | | |2.1.5, |
| | | |2.2.1 | | | | |2.3.4 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|grammaticalGender |String |SpeakToAs |Section | |level |String |PersonalInfo |Section |
| | | |2.2.3 | | | | |2.8.4 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|isOrdered |Boolean |Address, Name |Section | |links |Id[Link] |Card |Section |
| | | |2.5.1, | | | | |2.6.3 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.1 | |listAs |UnsignedInt |Directory, |Sections|
+-------------------+---------------------+-------------------------+------------+ | | |PersonalInfo |2.6.2, |
|keywords |String[Boolean] |Card |Section | | | | |2.8.4 |
| | | |2.8.2 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |localizations |String[PatchObject] |Card |Section |
|kind |String |AddressComponent, |Section | | | | |2.7.1 |
| | |Anniversary, Calendar, |2.5.1, | +-------------------+---------------------+------------------+--------+
| | |Card, CryptoKey, |Section | |media |Id[Media] |Card |Section |
| | |Directory, Link, Media, |2.8.1, | | | | |2.6.4 |
| | |NameComponent, |Section | +-------------------+---------------------+------------------+--------+
| | |PersonalInfo, Title |2.4.1, | |mediaType |String |Calendar, |Sections|
| | | |Section | | | |CryptoKey, |1.4.4, |
| | | |2.1.4, | | | |Directory, Link, |2.4.1, |
| | | |Section | | | |Media |2.6.1, |
| | | |2.6.1, | | | | |2.6.2, |
| | | |Section | | | | |2.6.3, |
| | | |2.6.2, | | | | |2.6.4 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.6.3, | |members |String[Boolean] |Card |Section |
| | | |Section | | | | |2.1.6 |
| | | |2.6.4, | +-------------------+---------------------+------------------+--------+
| | | |Section | |month |UnsignedInt |PartialDate |Section |
| | | |2.2.1, | | | | |2.8.1 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.4, | |name |Name |Card |Section |
| | | |Section | | | | |2.2.1 |
| | | |2.2.4 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |name |String |Author, Nickname, |Sections|
|label |String |Calendar, CryptoKey, |Section | | | |Organization, |2.8.3, |
| | |Directory, EmailAddress, |1.5.3, | | | |OrgUnit, Title |2.2.1.3,|
| | |Link, Media, |Section | | | | |2.2.2, |
| | |OnlineService, |2.4.1, | | | | |2.2.4 |
| | |PersonalInfo, Phone, |Section | +-------------------+---------------------+------------------+--------+
| | |SchedulingAddress |2.6.1, | |nicknames |Id[Nickname] |Card |Section |
| | | |Section | | | | |2.2.1.3 |
| | | |2.6.2, | +-------------------+---------------------+------------------+--------+
| | | |Section | |note |String |Note |Section |
| | | |2.3.1, | | | | |2.8.3 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.6.3, | |notes |Id[Note] |Card |Section |
| | | |Section | | | | |2.8.3 |
| | | |2.6.4, | +-------------------+---------------------+------------------+--------+
| | | |Section | |number |String |Phone |Section |
| | | |2.3.2, | | | | |2.3.3 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.4, | |onlineServices |Id[OnlineService] |Card |Section |
| | | |Section | | | | |2.3.2 |
| | | |2.3.3, | +-------------------+---------------------+------------------+--------+
| | | |Section | |organizationId |String |Title |Section |
| | | |2.4.2, | | | | |2.2.4 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |1.4.4 | |organizations |Id[Organization] |Card |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.2.2 |
|language |String |Card, LanguagePref |Section | +-------------------+---------------------+------------------+--------+
| | | |2.1.5, | |personalInfo |Id[PersonalInfo] |Card |Section |
| | | |Section | | | | |2.8.4 |
| | | |2.3.4 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |phones |Id[Phone] |Card |Section |
|level |String |PersonalInfo |Section | | | | |2.3.3 |
| | | |2.8.4 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |phonetic |String |AddressComponent, |Sections|
|links |Id[Link] |Card |Section | | | |NameComponent |2.5.1.2,|
| | | |2.6.3 | | | | |2.2.1.2 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|listAs |UnsignedInt |Directory, PersonalInfo |Section | |phoneticScript |String |Address, Name |Sections|
| | | |2.6.2, | | | | |2.2.1, |
| | | |Section | | | | |2.5.1 |
| | | |2.8.4 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |phoneticSystem |String |Address, Name |Sections|
|localizations |String[PatchObject] |Card |Section | | | | |2.2.1, |
| | | |2.7.1 | | | | |2.5.1 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|media |Id[Media] |Card |Section | |place |Address |Anniversary |Section |
| | | |2.6.4 | | | | |2.8.1 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|mediaType |String |Calendar, CryptoKey, |Section | |pref |UnsignedInt |Address, Calendar,|Sections|
| | |Directory, Link, Media |1.4.4, | | | |CryptoKey, |1.4.4, |
| | | |Section | | | |Directory, |1.5.4, |
| | | |2.4.1, | | | |EmailAddress, |2.5.1, |
| | | |Section | | | |LanguagePref, |2.4.1, |
| | | |2.6.1, | | | |Link, Media, |2.6.1, |
| | | |Section | | | |Nickname, |2.6.2, |
| | | |2.6.2, | | | |OnlineService, |2.3.1, |
| | | |Section | | | |Phone, Pronouns, |2.3.4, |
| | | |2.6.3, | | | |SchedulingAddress |2.6.3, |
| | | |Section | | | | |2.6.4, |
| | | |2.6.4 | | | | |2.2.1.3,|
+-------------------+---------------------+-------------------------+------------+ | | | |2.3.2, |
|members |String[Boolean] |Card |Section | | | | |2.3.3, |
| | | |2.1.6 | | | | |2.2.3, |
+-------------------+---------------------+-------------------------+------------+ | | | |2.4.2 |
|month |UnsignedInt |PartialDate |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.1 | |preferredLanguages |String[LanguagePref] |Card |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.3.4 |
|name |Name |Card |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.1 | |prodId |String |Card |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.1.7 |
|name |String |Author, Nickname, |Section | +-------------------+---------------------+------------------+--------+
| | |Organization, OrgUnit, |2.8.3, | |pronouns |Id[Pronouns] |SpeakToAs |Section |
| | |Title |Section | | | | |2.2.3 |
| | | |2.2.1.3, | +-------------------+---------------------+------------------+--------+
| | | |Section | |relatedTo |String[Relation] |Card |Section |
| | | |2.2.2, | | | | |2.1.8 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.4 | |relation |String[Boolean] |Relation |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.1.8 |
|nicknames |Id[Nickname] |Card |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.1.3 | |schedulingAddresses|Id[SchedulingAddress]|Card |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.4.2 |
|note |String |Note |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.3 | |service |String |OnlineService |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.3.2 |
|notes |Id[Note] |Card |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.3 | |sortAs |String[String] |Name |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.2.1 |
|number |String |Phone |Section | +-------------------+---------------------+------------------+--------+
| | | |2.3.3 | |sortAs |String |Organization, |Section |
+-------------------+---------------------+-------------------------+------------+ | | |OrgUnit |2.2.2 |
|onlineServices |Id[OnlineService] |Card |Section | +-------------------+---------------------+------------------+--------+
| | | |2.3.2 | |speakToAs |SpeakToAs |Card |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.2.3 |
|organizationId |String |Title |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.4 | |timeZone |String |Address |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.5.1 |
|organizations |Id[Organization] |Card |Section | +-------------------+---------------------+------------------+--------+
| | | |2.2.2 | |titles |Id[Title] |Card |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.2.4 |
|personalInfo |Id[PersonalInfo] |Card |Section | +-------------------+---------------------+------------------+--------+
| | | |2.8.4 | |uid |String |Card |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.1.9 |
|phones |Id[Phone] |Card |Section | +-------------------+---------------------+------------------+--------+
| | | |2.3.3 | |units |OrgUnit[] |Organization |Section |
+-------------------+---------------------+-------------------------+------------+ | | | |2.2.2 |
|phonetic |String |AddressComponent, |Section | +-------------------+---------------------+------------------+--------+
| | |NameComponent |2.5.1.2, | |updated |UTCDateTime |Card |Section |
| | | |Section | | | | |2.1.10 |
| | | |2.2.1.2 | +-------------------+---------------------+------------------+--------+
+-------------------+---------------------+-------------------------+------------+ |uri |String |Author, Calendar, |Sections|
|phoneticScript |String |Address, Name |Section | | | |CryptoKey, |1.4.4, |
| | | |2.2.1, | | | |Directory, Link, |2.8.3, |
| | | |Section | | | |Media, |2.4.1, |
| | | |2.5.1 | | | |OnlineService, |2.6.1, |
+-------------------+---------------------+-------------------------+------------+ | | |SchedulingAddress |2.6.2, |
|phoneticSystem |String |Address, Name |Section | | | | |2.6.3, |
| | | |2.2.1, | | | | |2.6.4, |
| | | |Section | | | | |2.3.2, |
| | | |2.5.1 | | | | |2.4.2 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|place |Address |Anniversary |Section | |user |String |OnlineService |Section |
| | | |2.8.1 | | | | |2.3.2 |
+-------------------+---------------------+-------------------------+------------+ +-------------------+---------------------+------------------+--------+
|pref |UnsignedInt |Address, Calendar, |Section | |utc |UTCDateTime |Timestamp |Section |
| | |CryptoKey, Directory, |1.5.4, | | | | |2.8.1 |
| | |EmailAddress, |Section | +-------------------+---------------------+------------------+--------+
| | |LanguagePref, Link, |2.5.1, | |value |String |AddressComponent, |Sections|
| | |Media, Nickname, |Section | | | |NameComponent, |2.5.1, |
| | |OnlineService, Phone, |2.4.1, | | | |PersonalInfo |2.2.1, |
| | |Pronouns, |Section | | | | |2.8.4 |
| | |SchedulingAddress |2.6.1, | +-------------------+---------------------+------------------+--------+
| | | |Section | |version |String |Card |Section |
| | | |2.6.2, | | | | |2.1.2 |
| | | |Section | +-------------------+---------------------+------------------+--------+
| | | |2.3.1, | |year |UnsignedInt |PartialDate |Section |
| | | |Section | | | | |2.8.1 |
| | | |2.3.4, | +-------------------+---------------------+------------------+--------+
| | | |Section |
| | | |2.6.3, | Table 2: JSContact Properties with "common" Usage
| | | |Section |
| | | |2.6.4, |
| | | |Section |
| | | |2.2.1.3, |
| | | |Section |
| | | |2.3.2, |
| | | |Section |
| | | |2.3.3, |
| | | |Section |
| | | |2.2.3, |
| | | |Section |
| | | |2.4.2, |
| | | |Section |
| | | |1.4.4 |
+-------------------+---------------------+-------------------------+------------+
|preferredLanguages |String[LanguagePref] |Card |Section |
| | | |2.3.4 |
+-------------------+---------------------+-------------------------+------------+
|prodId |String |Card |Section |
| | | |2.1.7 |
+-------------------+---------------------+-------------------------+------------+
|pronouns |Id[Pronouns] |SpeakToAs |Section |
| | | |2.2.3 |
+-------------------+---------------------+-------------------------+------------+
|relatedTo |String[Relation] |Card |Section |
| | | |2.1.8 |
+-------------------+---------------------+-------------------------+------------+
|relation |String[Boolean] |Relation |Section |
| | | |2.1.8 |
+-------------------+---------------------+-------------------------+------------+
|schedulingAddresses|Id[SchedulingAddress]|Card |Section |
| | | |2.4.2 |
+-------------------+---------------------+-------------------------+------------+
|service |String |OnlineService |Section |
| | | |2.3.2 |
+-------------------+---------------------+-------------------------+------------+
|sortAs |String[String] |Name |Section |
| | | |2.2.1 |
+-------------------+---------------------+-------------------------+------------+
|sortAs |String |Organization, OrgUnit |Section |
| | | |2.2.2 |
+-------------------+---------------------+-------------------------+------------+
|speakToAs |SpeakToAs |Card |Section |
| | | |2.2.3 |
+-------------------+---------------------+-------------------------+------------+
|timeZone |String |Address |Section |
| | | |2.5.1 |
+-------------------+---------------------+-------------------------+------------+
|titles |Id[Title] |Card |Section |
| | | |2.2.4 |
+-------------------+---------------------+-------------------------+------------+
|uid |String |Card |Section |
| | | |2.1.9 |
+-------------------+---------------------+-------------------------+------------+
|units |OrgUnit[] |Organization |Section |
| | | |2.2.2 |
+-------------------+---------------------+-------------------------+------------+
|updated |UTCDateTime |Card |Section |
| | | |2.1.10 |
+-------------------+---------------------+-------------------------+------------+
|uri |String |Author, Calendar, |Section |
| | |CryptoKey, Directory, |2.8.3, |
| | |Link, Media, |Section |
| | |OnlineService, |1.4.4, |
| | |SchedulingAddress |Section |
| | | |2.4.1, |
| | | |Section |
| | | |2.6.1, |
| | | |Section |
| | | |2.6.2, |
| | | |Section |
| | | |2.6.3, |
| | | |Section |
| | | |2.6.4, |
| | | |Section |
| | | |2.3.2, |
| | | |Section |
| | | |2.4.2 |
+-------------------+---------------------+-------------------------+------------+
|user |String |OnlineService |Section |
| | | |2.3.2 |
+-------------------+---------------------+-------------------------+------------+
|utc |UTCDateTime |Timestamp |Section |
| | | |2.8.1 |
+-------------------+---------------------+-------------------------+------------+
|value |String |AddressComponent, |Section |
| | |NameComponent, |2.5.1, |
| | |PersonalInfo |Section |
| | | |2.2.1, |
| | | |Section |
| | | |2.8.4 |
+-------------------+---------------------+-------------------------+------------+
|year |UnsignedInt |PartialDate |Section |
| | | |2.8.1 |
+-------------------+---------------------+-------------------------+------------+
Table 2: JSContact Properties with "common" usage
The following table lists the initial reserved usage entries of the The following table lists the initial reserved usage entries of the
"JSContact Properties" registry. All RFC section references are for "JSContact Properties" registry. For this property, the Change
[I-D.ietf-calext-jscontact]. The change controller for all these Controller is IETF, and the RFC section reference is for RFC 9553.
properties is IETF.
+===============+============+============+==============+==========+ +===============+============+============+=============+==========+
| Property | Property | Property | Reference or | Intended | | Property Name | Property | Property | Reference/ | Intended |
| Name | Type | Context | Description | Usage | | | Type | Context | Description | Usage |
+===============+============+============+==============+==========+ +===============+============+============+=============+==========+
| extra | not | not | Section | reserved | | extra | not | not | Section | reserved |
| | applicable | applicable | 1.5.2 | | | | applicable | applicable | 1.5.2 | |
+---------------+------------+------------+--------------+----------+ +---------------+------------+------------+-------------+----------+
Table 3: JSContact Properties with "reserved" usage Table 3: JSContact Properties with "reserved" Usage
3.6. Creation of the "JSContact Types" Registry 3.6. Creation of the JSContact Types Registry
IANA is asked to create the "JSContact Types" registry. The purpose IANA has created the "JSContact Types" registry. The purpose of this
of this new registry is to avoid name collisions for JSContact type new registry is to avoid name collisions for JSContact type names and
names and provide a complete reference for all data types used for provide a complete reference for all data types used for JSContact
JSContact property values. property values.
The registry entries sort alphabetically ascending by the "Type Name" The registry entries sort alphabetically in ascending order by the
column. Equal entries sort in any order. "Type Name" column. Equal entries sort in any order.
The registry process for a new type is outlined in Section 3.3. The registry process for a new type is outlined in Section 3.3.
3.6.1. "JSContact Types" Registry Template 3.6.1. JSContact Types Registry Template
Type Name: the name of the type
Reference or Description: a brief description or RFC number and Type Name: The name of the type.
section reference where the Type is specified (may be omitted for
"reserved" type names)
Intended Usage: common, reserved, or obsolete Intended Usage: May be "common", "reserved", or "obsolete".
Since Version: This defines the JSContact version on which this type Since Version: The JSContact version on which this type definition
definition is based on. The version MUST be one of the allowed is based. The version MUST be one of the allowed values of the
values of the version property in the JSContact Enum Value version property in the "JSContact Enum Values" registry (see
registry (see Table 1). Table 1).
Until Version: This defines the JSContact version after which this Until Version: The JSContact version after which the type definition
type definition got obsoleted and MUST NOT be used in later was obsoleted; therefore, it MUST NOT be used in later versions.
versions. The Until Version value either MUST be not set, or one The Until Version value either MUST NOT be set or MUST be one of
of the allowed values of the version property in the JSContact the allowed values of the version property in the "JSContact Enum
Enum Value registry (see Table 1). Values" registry (see Table 1).
Change Controller: This is who may request a change to this entry's Change Controller: This is who may request a change to the entry's
definition (IETF for RFCs from the IETF stream). definition (IETF for RFCs from the IETF stream).
3.6.2. Initial Contents for the "JSContact Types" Registry Reference or Description: A brief description or RFC number and
section reference where the Type is specified. For reserved type
names, the reference or description MAY be omitted.
The following table lists the initial common usage entries of the 3.6.2. Initial Contents of the JSContact Types Registry
JSContact Types registry. The Since Version for all types is 1.0.
The Until Version for all types is not set. All RFC section The following table lists the initial common usage entries in the
references are for [I-D.ietf-calext-jscontact]. The change "JSContact Types" registry. For all of these types, the Since
controller for all these properties is IETF. Version is 1.0, the Until Version is not set, the Change Controller
is IETF, and RFC section references are for RFC 9553.
+===================+==========================+ +===================+==========================+
| Type Name | Reference or Description | | Type Name | Reference or Description |
+===================+==========================+ +===================+==========================+
| Address | Section 2.5.1 | | Address | Section 2.5.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| AddressComponent | Section 2.5.1 | | AddressComponent | Section 2.5.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Anniversary | Section 2.8.1 | | Anniversary | Section 2.8.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
skipping to change at page 71, line 48 skipping to change at line 3149
+-------------------+--------------------------+ +-------------------+--------------------------+
| Timestamp | Section 2.8.1 | | Timestamp | Section 2.8.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Title | Section 2.2.4 | | Title | Section 2.2.4 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| UnsignedInt | Section 1.4.2 | | UnsignedInt | Section 1.4.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| UTCDateTime | Section 1.4.5 | | UTCDateTime | Section 1.4.5 |
+-------------------+--------------------------+ +-------------------+--------------------------+
Table 4: JSContact Types with "common" usage Table 4: JSContact Types with "common" Usage
The following table lists the initial reserved usage entries of the The following table lists the initial reserved usage entry of the
JSContact Types registry. All types are for version 1.0. All RFC "JSContact Types" registry. For this type, the version is 1.0, the
section references are for [I-D.ietf-calext-jscontact]. The change Change Controller is IETF, and the RFC section reference is for RFC
controller for all these properties is IETF. 9553.
+===========+==========================+ +===========+==========================+
| Type Name | Reference or Description | | Type Name | Reference or Description |
+===========+==========================+ +===========+==========================+
| Resource | Section 1.4.4 | | Resource | Section 1.4.4 |
+-----------+--------------------------+ +-----------+--------------------------+
Table 5: JSContact Types with Table 5: JSContact Types with
"reserved" usage "reserved" Usage
3.7. Creation of the "JSContact Enum Values" Registry 3.7. Creation of the JSContact Enum Values Registry
IANA is asked to create the "JSContact Enum Values" registry. The IANA has created the "JSContact Enum Values" registry. The purpose
purpose of the new registry is to allow interoperable extension of of the new registry is to allow interoperable extension of semantics
semantics for JSContact properties with enumerable values. Each such for JSContact properties with enumerable values. Each such property
property will have a subregistry of allowed values. will have a subregistry of allowed values.
The registry entries sort alphabetically ascending by the "Property The registry entries sort alphabetically in ascending order by the
Name" column first, "Property Context" second, "Since Version" third. following columns: "Property Name" first, "Property Context" second,
The enum values sort alphabetically ascending. Equal entries sort in and "Since Version" third. The enum values sort alphabetically in
any order. ascending order. Equal entries sort in any order.
The registry process for a new enum value or adding a new enumerable The registry process for a new enum value or adding a new enumerable
property is outlined in Section 3.3. property is outlined in Section 3.3.
3.7.1. "JSContact Enum Values" Registry Property Template 3.7.1. JSContact Enum Values Registry Property Template
This template is for adding a subregistry for a new enumerable This template is for adding a subregistry for a new enumerable
property to the "JSContact Enum" registry. property to the "JSContact Enum Values" registry.
Property Name: These are the name(s) of the property or properties Property Name: The name(s) of the property or properties where these
where these values may be used. This MUST be registered in the values may be used. This MUST be registered in the "JSContact
"JSContact Properties" registry. Properties" registry.
Context: This is the list of allowed object types where the property Context: The list of allowed object types where the property or
or properties may appear, as registered in the "JSContact properties may appear, as registered in the "JSContact Properties"
Properties" registry. This disambiguates where there may be two registry. This disambiguates where there may be two distinct
distinct properties with the same name in different contexts. properties with the same name in different contexts.
Since Version: This defines the JSContact version on which this enum Since Version: The JSContact version on which the enum value
value definition is based on. The version MUST be one of the definition is based. The version MUST be one of the allowed
allowed values of the version property in the JSContact Enum Value values of the version property in the "JSContact Enum Values"
registry (see Table 1). registry (see Table 1).
Until Version: This defines the JSContact version after which this Until Version: The JSContact version after which the enum value
enum value definition got obsoleted and MUST NOT be used in later definition was obsoleted; therefore, the enum value definition
versions. The Until Version value either MUST be not set, or one MUST NOT be used in later versions. The Until Version value
of the allowed values of the version property in the JSContact either MUST NOT be set or MUST be one of the allowed values of the
Enum Value registry (see Table 1). version property in the "JSContact Enum Values" registry (see
Table 1).
Change Controller: This is who may request a change to this entry's Change Controller: This is who may request a change to the entry's
definition (IETF for RFCs from the IETF stream). definition (IETF for RFCs from the IETF stream).
Initial Contents: This is the initial list of defined values for Initial Contents: The initial list of defined values for the enum,
this enum, using the template defined in Section 3.7.2. A using the template defined in Section 3.7.2. A subregistry will
subregistry will be created with these values for this property be created with these values for this property name/context tuple.
name/context tuple.
3.7.2. "JSContact Enum Values" Registry Value Template 3.7.2. JSContact Enum Values Registry Value Template
This template is for adding a new enum value to a subregistry in the This template is for adding a new enum value to a subregistry in the
JSContact Enum registry. "JSContact Enum Values" registry.
Enum Value: The verbatim value of the enum. Enum Value: The verbatim value of the enum.
Reference or Description: A brief description or RFC number and
section reference for the semantics of this value.
Since Version: The JSContact version on which the enum value Since Version: The JSContact version on which the enum value
definition is based on. The version MUST be one of the allowed definition is based. The version MUST be one of the allowed
values of the version property in the JSContact Enum Value values of the version property in the "JSContact Enum Values"
registry (see Table 1). registry (see Table 1).
Until Version: The JSContact version after which this enum value got Until Version: The JSContact version after which the enum value was
obsoleted and MUST NOT be used in later versions. The Until obsoleted; therefore, the enum value MUST NOT be used in later
Version value either MUST be not set, or one of the allowed values versions. The Until Version value either MUST NOT be set or MUST
of the version property in the JSContact Enum Value registry (see be one of the allowed values of the version property in the
Table 1). "JSContact Enum Values" registry (see Table 1).
3.7.3. Initial Contents for the "JSContact Enum Values" Registry Reference or Description: A brief description or RFC number and
section reference for the semantics of the value.
For each subregistry created in this section, all RFC section 3.7.3. Initial Contents of the JSContact Enum Values Registry
references are for [I-D.ietf-calext-jscontact]. For all entries, the
For all entries in each subregistry created in this section, the
Since Version is 1.0, the Until Version is not set, the Change Since Version is 1.0, the Until Version is not set, the Change
Controller is IETF. Controller is IETF, and RFC section references are for RFC 9553.
Property Name: contexts Property Name: contexts
Context: Address Context: Address
Initial Contents: Initial Contents:
+============+==========================+ +============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
+============+==========================+ +============+==========================+
| billing | Section 2.5.1 | | billing | Section 2.5.1 |
+------------+--------------------------+ +------------+--------------------------+
| delivery | Section 2.5.1 | | delivery | Section 2.5.1 |
+------------+--------------------------+ +------------+--------------------------+
| private | Section 1.5.1 | | private | Section 1.5.1 |
+------------+--------------------------+ +------------+--------------------------+
| work | Section 1.5.1 | | work | Section 1.5.1 |
skipping to change at page 75, line 48 skipping to change at line 3325
| feminine | Section 2.2.3 | | feminine | Section 2.2.3 |
+------------+--------------------------+ +------------+--------------------------+
| inanimate | Section 2.2.3 | | inanimate | Section 2.2.3 |
+------------+--------------------------+ +------------+--------------------------+
| masculine | Section 2.2.3 | | masculine | Section 2.2.3 |
+------------+--------------------------+ +------------+--------------------------+
| neuter | Section 2.2.3 | | neuter | Section 2.2.3 |
+------------+--------------------------+ +------------+--------------------------+
Table 9: JSContact Enum Values for Table 9: JSContact Enum Values for
kind (Context: SpeakToAs) grammaticalGender (Context:
SpeakToAs)
Property Name: kind Property Name: kind
Context: AddressComponent Context: AddressComponent
Initial Contents: Initial Contents:
+===============+==========================+ +===============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
+===============+==========================+ +===============+==========================+
| apartment | Section 2.5.1 | | apartment | Section 2.5.1 |
+---------------+--------------------------+ +---------------+--------------------------+
| block | Section 2.5.1 | | block | Section 2.5.1 |
+---------------+--------------------------+ +---------------+--------------------------+
| building | Section 2.5.1 | | building | Section 2.5.1 |
+---------------+--------------------------+ +---------------+--------------------------+
| country | Section 2.5.1 | | country | Section 2.5.1 |
skipping to change at page 80, line 32 skipping to change at line 3538
| high | Section 2.8.4 | | high | Section 2.8.4 |
+------------+--------------------------+ +------------+--------------------------+
| low | Section 2.8.4 | | low | Section 2.8.4 |
+------------+--------------------------+ +------------+--------------------------+
| medium | Section 2.8.4 | | medium | Section 2.8.4 |
+------------+--------------------------+ +------------+--------------------------+
Table 20: JSContact Enum Values for Table 20: JSContact Enum Values for
level (Context: PersonalInfo) level (Context: PersonalInfo)
Property Name: phoneticSystem
Context: Address, Name
Initial Contents:
+============+==========================+
| Enum Value | Reference or Description |
+============+==========================+
| ipa | Section 1.5.5 |
+------------+--------------------------+
| jyut | Section 1.5.5 |
+------------+--------------------------+
| piny | Section 1.5.5 |
+------------+--------------------------+
Table 21: JSContact Enum Values for
phoneticSystem (Context: Address,
Name)
Property Name: relation Property Name: relation
Context: Relation Context: Relation
Initial Contents: Initial Contents:
+==============+==========================+ +==============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
+==============+==========================+ +==============+==========================+
| acquaintance | Section 2.1.8 | | acquaintance | Section 2.1.8 |
+--------------+--------------------------+ +--------------+--------------------------+
| agent | Section 2.1.8 | | agent | Section 2.1.8 |
+--------------+--------------------------+ +--------------+--------------------------+
| child | Section 2.1.8 | | child | Section 2.1.8 |
+--------------+--------------------------+ +--------------+--------------------------+
| colleague | Section 2.1.8 | | colleague | Section 2.1.8 |
skipping to change at page 81, line 49 skipping to change at line 3602
+--------------+--------------------------+ +--------------+--------------------------+
| parent | Section 2.1.8 | | parent | Section 2.1.8 |
+--------------+--------------------------+ +--------------+--------------------------+
| sibling | Section 2.1.8 | | sibling | Section 2.1.8 |
+--------------+--------------------------+ +--------------+--------------------------+
| spouse | Section 2.1.8 | | spouse | Section 2.1.8 |
+--------------+--------------------------+ +--------------+--------------------------+
| sweetheart | Section 2.1.8 | | sweetheart | Section 2.1.8 |
+--------------+--------------------------+ +--------------+--------------------------+
Table 21: JSContact Enum Values for Table 22: JSContact Enum Values for
relation (Context: Relation) relation (Context: Relation)
Property Name: phoneticSystem
Context: Address, Name
Initial Contents:
+============+==========================+
| Enum Value | Reference or Description |
+============+==========================+
| ipa | Section 1.5.5 |
+------------+--------------------------+
| jyut | Section 1.5.5 |
+------------+--------------------------+
| piny | Section 1.5.5 |
+------------+--------------------------+
Table 22: JSContact Enum Values for
phoneticSystem (Context: Address,
Name)
4. Security Considerations 4. Security Considerations
Contact information is very privacy-sensitive. It can reveal the Contact information is very privacy sensitive. It can reveal the
identity, location and credentials information, employment status, identity, location, credentials information, employment status,
interests and hobbies, and social network of a user. Its interests and hobbies, and social network of a user. Its
transmission and storage must be done carefully to protect it from transmission and storage must be done carefully to protect it from
possible threats, such as eavesdropping, replay, message insertion, possible threats such as eavesdropping, replay, message insertion,
deletion, modification, and on-path attacks. deletion, modification, and on-path attacks.
The data being stored and transmitted may be used in systems with The data being stored and transmitted may be used in systems with
real-world consequences. For example, a malicious actor might real-world consequences. For example, a malicious actor might
provide JSContact data that uses the name of another person but provide JSContact data that uses the name of another person but
insert their contact details to impersonate the unknown victim. Such insert their contact details to impersonate the unknown victim. Such
systems must be careful to authenticate all data they receive to systems must be careful to authenticate all data they receive to
prevent them from being subverted and ensure the change comes from an prevent them from being subverted and ensure the change comes from an
authorized entity. authorized entity.
skipping to change at page 83, line 45 skipping to change at line 3678
number of URIs. In the case of published address books with a large number of URIs. In the case of published address books with a large
number of subscribers, such objects could be widely distributed. number of subscribers, such objects could be widely distributed.
Implementations should be careful to limit the automatic fetching of Implementations should be careful to limit the automatic fetching of
linked resources to reduce the risk of this being an amplification linked resources to reduce the risk of this being an amplification
vector for a denial-of-service attack. vector for a denial-of-service attack.
5. References 5. References
5.1. Normative References 5.1. Normative References
[IANATZ] "IANA Time Zone Database", [IANA-TZ] IANA, "Time Zone Database",
<https://www.iana.org/time-zones>. <https://www.iana.org/time-zones>.
[IANAvCard] [IANA-vCard]
"IANA vCard Elements", <https://www.iana.org/assignments/ IANA, "vCard Elements",
vcard-elements/vcard-elements.xhtml>. <https://www.iana.org/assignments/vcard-elements>.
[ISO.3166-1.2006] [ISO.3166-1]
International Organization for Standardization, "Codes for International Organization for Standardization, "Codes for
the representation of names of countries, 3rd edition", the representation of names of countries and their
ISO Standard 3166-1, 2006. subdivisions -- Part 1: Country codes", ISO 3166-1:2020,
August 2020.
[RFC1034] Mockapetris, P., "Domain names - concepts and facilities", [RFC1034] Mockapetris, P., "Domain names - concepts and facilities",
STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987,
<https://www.rfc-editor.org/info/rfc1034>. <https://www.rfc-editor.org/info/rfc1034>.
[RFC1035] Mockapetris, P., "Domain names - implementation and [RFC1035] Mockapetris, P., "Domain names - implementation and
specification", STD 13, RFC 1035, DOI 10.17487/RFC1035, specification", STD 13, RFC 1035, DOI 10.17487/RFC1035,
November 1987, <https://www.rfc-editor.org/info/rfc1035>. November 1987, <https://www.rfc-editor.org/info/rfc1035>.
[RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
skipping to change at page 86, line 5 skipping to change at line 3783
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
Interchange Format", STD 90, RFC 8259, Interchange Format", STD 90, RFC 8259,
DOI 10.17487/RFC8259, December 2017, DOI 10.17487/RFC8259, December 2017,
<https://www.rfc-editor.org/info/rfc8259>. <https://www.rfc-editor.org/info/rfc8259>.
5.2. Informative References 5.2. Informative References
[I-D.ietf-calext-jscontact] [IPA] IPA, "International Phonetic Alphabet",
Stepanek, R. and M. Loffredo, "JSContact: A JSON
representation of contact data", Work in Progress,
Internet-Draft, draft-ietf-calext-jscontact-15, 18
September 2023, <https://datatracker.ietf.org/doc/html/
draft-ietf-calext-jscontact-15>.
[I-D.ietf-uuidrev-rfc4122bis]
Davis, K. R., Peabody, B., and P. Leach, "Universally
Unique IDentifiers (UUID)", Work in Progress, Internet-
Draft, draft-ietf-uuidrev-rfc4122bis-14, 6 November 2023,
<https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-
rfc4122bis-14>.
[IPA] "International Phonetic Alphabet",
<https://www.internationalphoneticalphabet.org/>. <https://www.internationalphoneticalphabet.org/>.
[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston,
A., Peterson, J., Sparks, R., Handley, M., and E. A., Peterson, J., Sparks, R., Handley, M., and E.
Schooler, "SIP: Session Initiation Protocol", RFC 3261, Schooler, "SIP: Session Initiation Protocol", RFC 3261,
DOI 10.17487/RFC3261, June 2002, DOI 10.17487/RFC3261, June 2002,
<https://www.rfc-editor.org/info/rfc3261>. <https://www.rfc-editor.org/info/rfc3261>.
[RFC3966] Schulzrinne, H., "The tel URI for Telephone Numbers", [RFC3966] Schulzrinne, H., "The tel URI for Telephone Numbers",
RFC 3966, DOI 10.17487/RFC3966, December 2004, RFC 3966, DOI 10.17487/RFC3966, December 2004,
skipping to change at page 87, line 28 skipping to change at line 3841
[RFC8499] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS [RFC8499] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS
Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499,
January 2019, <https://www.rfc-editor.org/info/rfc8499>. January 2019, <https://www.rfc-editor.org/info/rfc8499>.
[RFC8605] Hollenbeck, S. and R. Carney, "vCard Format Extensions: [RFC8605] Hollenbeck, S. and R. Carney, "vCard Format Extensions:
ICANN Extensions for the Registration Data Access Protocol ICANN Extensions for the Registration Data Access Protocol
(RDAP)", RFC 8605, DOI 10.17487/RFC8605, May 2019, (RDAP)", RFC 8605, DOI 10.17487/RFC8605, May 2019,
<https://www.rfc-editor.org/info/rfc8605>. <https://www.rfc-editor.org/info/rfc8605>.
[UBiDi] "Unicode® Standard Annex #9: Unicode Bidirectional [UBiDi] The Unicode Consortium, "Unicode Standard Annex #9:
Algorithm", <https://www.unicode.org/reports/tr9/>. Unicode Bidirectional Algorithm", Revision 48,
Unicode 15.1.0, August 2023,
<https://www.unicode.org/reports/tr9/>.
[W3C-URL] "W3C WG URL - Living Standard — Last Updated 21 August [UUID] Davis, K. R., Peabody, B. G., and P. Leach, "Universally
2023", <https://url.spec.whatwg.org>. Unique IDentifiers (UUID)", Work in Progress, Internet-
Draft, draft-ietf-uuidrev-rfc4122bis-14, 6 November 2023,
<https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-
rfc4122bis-14>.
[WHATWG-URL]
WHATWG, "URL Living Standard", January 2024,
<https://url.spec.whatwg.org>.
Authors' Addresses Authors' Addresses
Robert Stepanek Robert Stepanek
Fastmail Fastmail
PO Box 234, Collins St West PO Box 234
Melbourne VIC 8007 Collins St. West
Melbourne VIC 8007
Australia Australia
Email: rsto@fastmailteam.com Email: rsto@fastmailteam.com
Mario Loffredo Mario Loffredo
IIT-CNR IIT-CNR
Via Moruzzi,1 Via Moruzzi, 1
56124 Pisa 56124 Pisa
Italy Italy
Email: mario.loffredo@iit.cnr.it Email: mario.loffredo@iit.cnr.it
 End of changes. 542 change blocks. 
1640 lines changed or deleted 1496 lines changed or added

This html diff was produced by rfcdiff 1.48.