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.
Two additional specifications define new vCard elements and how to
convert between JSContact and vCard.
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. label
1.5.3. label . . . . . . . . . . . . . . . . . . . . . . . . 12 1.5.3. pref
1.5.4. pref . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.4. phonetic
1.5.5. phonetic . . . . . . . . . . . . . . . . . . . . . . 13 1.6. Internationalization
1.6. Internationalization . . . . . . . . . . . . . . . . . . 14 1.6.1. Free-Form Text
1.6.1. Free-form text . . . . . . . . . . . . . . . . . . . 14 1.6.2. URIs
1.6.2. URIs . . . . . . . . . . . . . . . . . . . . . . . . 15 1.7. Validating JSContact
1.7. Validating JSContact . . . . . . . . . . . . . . . . . . 15 1.7.1. Case-Sensitivity
1.7.1. Case-Sensitivity . . . . . . . . . . . . . . . . . . 15 1.7.2. IANA-Registered Properties
1.7.2. IANA-registered Properties . . . . . . . . . . . . . 16 1.7.3. Reserved Properties
1.7.3. Unknown Properties . . . . . . . . . . . . . . . . . 16 1.7.4. Unknown Properties
1.7.4. Enumerated Values . . . . . . . . . . . . . . . . . . 16 1.7.5. 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. nicknames
2.2.3. speakToAs . . . . . . . . . . . . . . . . . . . . . . 31 2.2.3. organizations
2.2.4. titles . . . . . . . . . . . . . . . . . . . . . . . 32 2.2.4. speakToAs
2.3. Contact Properties . . . . . . . . . . . . . . . . . . . 33 2.2.5. titles
2.3.1. emails . . . . . . . . . . . . . . . . . . . . . . . 33 2.3. Contact Properties
2.3.2. onlineServices . . . . . . . . . . . . . . . . . . . 34 2.3.1. emails
2.3.3. phones . . . . . . . . . . . . . . . . . . . . . . . 35 2.3.2. onlineServices
2.3.4. preferredLanguages . . . . . . . . . . . . . . . . . 37 2.3.3. phones
2.4. Calendaring and Scheduling Properties . . . . . . . . . . 38 2.3.4. preferredLanguages
2.4.1. calendars . . . . . . . . . . . . . . . . . . . . . . 38 2.4. Calendaring and Scheduling Properties
2.4.2. schedulingAddresses . . . . . . . . . . . . . . . . . 38 2.4.1. calendars
2.5. Address and Location Properties . . . . . . . . . . . . . 39 2.4.2. schedulingAddresses
2.5.1. addresses . . . . . . . . . . . . . . . . . . . . . . 39 2.5. Address and Location Properties
2.6. Resource Properties . . . . . . . . . . . . . . . . . . . 44 2.5.1. addresses
2.6.1. cryptoKeys . . . . . . . . . . . . . . . . . . . . . 45 2.6. Resource Properties
2.6.2. directories . . . . . . . . . . . . . . . . . . . . . 45 2.6.1. cryptoKeys
2.6.3. links . . . . . . . . . . . . . . . . . . . . . . . . 46 2.6.2. directories
2.6.4. media . . . . . . . . . . . . . . . . . . . . . . . . 47 2.6.3. links
2.7. Multilingual Properties . . . . . . . . . . . . . . . . . 48 2.6.4. media
2.7.1. localizations . . . . . . . . . . . . . . . . . . . . 48 2.7. Multilingual Properties
2.8. Additional Properties . . . . . . . . . . . . . . . . . . 50 2.7.1. localizations
2.8.1. anniversaries . . . . . . . . . . . . . . . . . . . . 50 2.8. Additional Properties
2.8.2. keywords . . . . . . . . . . . . . . . . . . . . . . 52 2.8.1. anniversaries
2.8.3. notes . . . . . . . . . . . . . . . . . . . . . . . . 52 2.8.2. keywords
2.8.4. personalInfo . . . . . . . . . . . . . . . . . . . . 53 2.8.3. notes
3. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 54 2.8.4. personalInfo
3.1. Media Type Registration . . . . . . . . . . . . . . . . . 54 3. IANA Considerations
3.2. Creation of the "JSContact" Registry Group . . . . . . . 56 3.1. Media Type Registration
3.3. Registry Policy and Change Procedures . . . . . . . . . . 56 3.2. Creation of the JSContact Registry Group
3.3.1. Preliminary Community Review . . . . . . . . . . . . 57 3.3. Registry Policy and Change Procedures
3.3.2. Submit Request to IANA . . . . . . . . . . . . . . . 57 3.3.1. Preliminary Community Review
3.3.3. Designated Expert Review . . . . . . . . . . . . . . 57 3.3.2. Submit Request to IANA
3.3.4. Change Procedures . . . . . . . . . . . . . . . . . . 58 3.3.3. Designated Expert Review
3.4. Creation of the "JSContact Version" Registry . . . . . . 58 3.3.4. Change Procedures
3.4.1. "JSContact Version" Registry Template . . . . . . . . 58 3.4. Creation of the JSContact Version Registry
3.4.2. Initial Contents for the "JSContact Version" 3.4.1. JSContact Version Registry Template
Registry . . . . . . . . . . . . . . . . . . . . . . 59 3.4.2. Initial Contents of the JSContact Version Registry
3.5. Creation of the JSContact Properties Registry
3.5. Creation of the "JSContact Properties" Registry . . . . . 59 3.5.1. JSContact Properties Registry Template
3.5.1. "JSContact Properties" Registry Template . . . . . . 59 3.5.2. Initial Contents of the JSContact Properties Registry
3.5.2. Initial Contents for the "JSContact Properties" 3.6. Creation of the JSContact Types Registry
Registry . . . . . . . . . . . . . . . . . . . . . . 60 3.6.1. JSContact Types Registry Template
3.6. Creation of the "JSContact Types" Registry . . . . . . . 69 3.6.2. Initial Contents of the JSContact Types Registry
3.6.1. "JSContact Types" Registry Template . . . . . . . . . 69 3.7. Creation of the JSContact Enum Values Registry
3.6.2. Initial Contents for the "JSContact Types" 3.7.1. JSContact Enum Values Registry Property Template
Registry . . . . . . . . . . . . . . . . . . . . . . 70 3.7.2. JSContact Enum Values Registry Value Template
3.7. Creation of the "JSContact Enum Values" Registry . . . . 72 3.7.3. Initial Contents of the JSContact Enum Values Registry
3.7.1. "JSContact Enum Values" Registry Property Template . 72 4. Security Considerations
3.7.2. "JSContact Enum Values" Registry Value Template . . . 73 4.1. JSON Parsing
3.7.3. Initial Contents for the "JSContact Enum Values" 4.2. URI Values
Registry . . . . . . . . . . . . . . . . . . . . . . 73 5. References
4. Security Considerations . . . . . . . . . . . . . . . . . . . 82 5.1. Normative References
4.1. JSON Parsing . . . . . . . . . . . . . . . . . . . . . . 82 5.2. Informative References
4.2. URI Values . . . . . . . . . . . . . . . . . . . . . . . 83 Authors' Addresses
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 must be described as simple key-
simple key-value pairs, reducing complexity of their value pairs to reduce the complexity of the representation of the
representation. card data.
* 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.
Two additional documents define the relation of JSContact and vCard:
[RFC9554] defines new vCard properties and parameters, and [RFC9555]
defines how to convert JSContact data from and to vCard.
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.
The names "Foo" and "baz" are only for demonstration and have no
meaning outside the example.
| A Foo object has the following properties: A Foo object has the following properties:
|
| * qux: Number (mandatory). Defines the qux-ishness of this
| contact. The value MUST be an integer greater than 0 and less
| than 10.
Here, a JSContact object type named Foo is defined. In addition to @type: String. The JSContact type of the object. The value MUST
its @type property it has a property named qux for which values MUST be "Foo", if set.
be valid according to the definition of the Number type. The
property has one attribute, mandatory, which specifies that the baz: Number (mandatory). The baz level of the contact. The value
property MUST be present for an instance of this JSContact object to MUST be an integer greater than 0 and less than 10.
be valid. Finally, a free-text description describes the semantics
and further restrictions. The above paragraph illustrates the following:
* It defines a JSContact object type named "Foo" that has two
properties, named "@type" and "baz".
* The @type property adheres to the rules outlined in Section 1.3.4.
Because of this, it is neither defined to be mandatory nor
optional, as this depends on how the Foo object type is used.
* The baz property value MUST be valid according to the definition
of the Number type.
* The property has one attribute, "mandatory", which specifies that
the property MUST be present for a value of the Foo object type to
be valid.
* The free-text description of the baz property describes the
semantics and further restrictions for its values.
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. The JSContact type of a JSON object. It MUST match
the type name of the JSContact object of which the JSON object is
* @type: String. Specifies the type of this object. This MUST an 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
it is an instance of A. It MUST have the @type property set if it if it is an instance of A. It MUST have the @type property set if
is an instance of B. If instead the defaultType attribute is not it 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 topmost
JSON data (directly or as member of an array), MUST have the @type object in JSON data (directly or as a member of an array), MUST
property set. have the @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
a maximum of 255 octets in size, and it MUST only contain characters and a maximum of 255 octets in size, and it MUST only contain
from the URL and Filename Safe base64url alphabet, as defined in characters from the "URL and Filename Safe" base64url alphabet, as
Section 5 of [RFC4648], excluding the pad character (=). This means defined in Section 5 of [RFC4648], excluding the pad character ("=").
the allowed characters are the ASCII alphanumeric characters (A-Za- This means the allowed characters are the ASCII alphanumeric
z0-9), hyphen (-), and underscore (_). characters ("A-Za-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
range 0 <= value <= 2^53-1, represented as a JSON Number. the 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 patches on a JSON object. Each key is a path represented in a of patches on a JSON object. Each key is a path represented in a
subset of JSON pointer format [RFC6901]. The paths have an implicit subset of the JSON Pointer format [RFC6901]. The paths have an
leading /, so each key is prefixed with / before applying the JSON implicit leading "/", so each key is prefixed with "/" before
pointer evaluation algorithm. applying the JSON 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, the @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 type as the basis for their property-specific value types. The
Resource data type defines the properties that are common to all of Resource type defines the properties that are common to all of them.
them. Property definitions making use of Resource MAY define Property definitions making use of Resource MAY define additional
additional properties for their value types. properties for their value types.
The @type property value MUST NOT be Resource, instead it MUST be the A Resource object has the following properties:
name of a concrete resource type (see Section 2.6). A Resource
object has the following properties.
* @type: String. Specifies the type of this resource object. The @type: String. The JSContact type of the object. The value MUST NOT
allowed value is defined in later sections of this document for be "Resource"; instead, the value MUST be the name of a concrete
each concrete resource type (Section 2.6). resource type (see 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). The media type [RFC2046] of the
Provides the media type [RFC2046] of the resource identified by resource identified by the uri property value.
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.3.
* 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.2.
1.4.5. UTCDateTime 1.4.5. UTCDateTime
This is a string in [RFC3339] date-time format, with the further The UTCDateTime type is a String in "date-time" format [RFC3339],
restrictions that any letters MUST be in uppercase, and the time with further restrictions that any letters MUST be in uppercase and
offset MUST be the character Z. Fractional second values MUST NOT be the time offset MUST be the character "Z". Fractional second values
included unless non-zero and MUST NOT have trailing zeros, to ensure MUST NOT be included unless they are non-zero, and they MUST NOT have
there is only a single representation for each date-time. trailing 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] contexts: String[Boolean]. The contexts in which to use the contact
information. For example, someone might have distinct phone
This property associates contact information with one or more numbers for work and private contexts and may set the desired
contexts in which it should be used. For example, someone might have context on the respective phone number in the phones
distinct phone numbers for work and private contexts, and may set the (Section 2.3.3) property.
desired context on the respective phone number in the phones
(Section 2.3.3) property.
This section defines common contexts. Additional contexts may be
defined in the properties or data types that make use of this
property. The enumerated (Section 1.7.4) common context values are:
* private: the contact information may be used in a private context.
* work: the contact information may be used in a professional
context.
1.5.2. extra
This is a reserved property name. Implementations MUST NOT set this This section defines common contexts. Additional contexts may be
property in a JSContact object. Any JSContact object including a defined in the properties or data types that make use of this
property with this name MUST be considered invalid. property. The enumerated (Section 1.7.5) common context values
are:
The purpose of this reserved property name is to provide implementors * private: the contact information that may be used in a private
with a name which is certain to never occur as a property name in a context.
JSContact object. Implementations might want to map unknown or
vendor-specific properties to a variable with this name, but this is
implementation-specific.
1.5.3. label * work: the contact information that may be used in a
professional context.
Type: String 1.5.2. label
This property allows associating contact data with user-defined
labels. Such labels may be set for phone numbers, email addresses
and resources. Typically, these labels are displayed along with
their associated contact data in graphical user interfaces. Such
labels best be succinct to properly display on small graphical
interfaces and screens.
1.5.4. pref label: String. The labels associated with the contact data. Such
labels may be set for phone numbers, email addresses, and other
resources. Typically, these labels are displayed along with their
associated contact data in graphical user interfaces. Note that
succinct labels are best for proper display on small graphical
interfaces and screens.
Type: UnsignedInt 1.5.3. pref
This property allows defining a preference order for contact pref: UnsignedInt. A preference order for contact information. For
information. For example, a person may have two email addresses and example, a person may have two email addresses and prefer to be
prefer to be contacted with one of them. contacted with one of them.
Its value MUST be in the range 1 and 100. Lower values correspond to The value MUST be in the range of 1 to 100. Lower values
a higher level of preference, with 1 being most preferred. If no correspond to a higher level of preference, with 1 being most
preference is set, then the contact information MUST be interpreted preferred. If no preference is set, then the contact information
as being least preferred. MUST be interpreted 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.4. phonetic
This property defines how to pronounce a value in the language The following properties define 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 these properties 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. The phonetic representation of a value. Any
value. Any script language subtag in the Card language 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 and not used with the phonetic property.
property. If this property is set, then at least one of the If this property is set, then at least one of the phoneticScript
phoneticScript or phoneticSystem properties that relate to this or phoneticSystem properties that relate to this value MUST be
value MUST be set. 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.5)
(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.1) and Address (Section 2.5.1.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.4 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.4).
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 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 ASCII alphanumeric
alphanumeric characters that match the ALPHA and DIGIT rules defined characters that match the ALPHA and DIGIT rules defined in
in Appendix B.1 of [RFC5234]) or the COMMERCIAL AT (U+0040) 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. Reserved Properties
IANA-registered properties can be reserved (Section 3.3).
Implementations MUST NOT set properties having a reserved name in
JSContact objects for which this property is reserved or all objects
if the property context in the registry is "not applicable".
Reserved properties have no type, and their type signature is "not
applicable". Any JSContact object including a property that is
reserved in context of this object MUST be considered invalid.
This document reserves one property:
1.7.3.1. extra
extra: not applicable. The reserved property "extra" provides
implementors with a property name that is certain to never occur
as a property in any JSContact object. Implementations might want
to map unknown or vendor-specific properties to a variable with
this name, but this is implementation-specific.
1.7.4. 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.5. 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
The prefix and name together form the property name. The vendor- below. The prefix and name together form the property name. The
specific prefix MUST be a domain name under control of the service or vendor-specific prefix MUST be a domain name under control of the
application that sets the property, but it need not resolve in the service or application that sets the property, but it need not
Domain Name System [RFC1034] and [RFC1035]. The prefix ietf.org and resolve in the Domain Name System [RFC1034] [RFC1035]. The prefix
its subdomain names are reserved for IETF specifications. The name "ietf.org" and its subdomain names are reserved for IETF
MUST NOT contain the TILDE (U+007E) and SOLIDUS (U+002F) characters, specifications. The name MUST NOT contain the TILDE (U+007E) and
as these require special-escaping when encoding a JSON Pointer SOLIDUS (U+002F) characters, as these require special escaping when
[RFC6901] for that property. encoding a JSON Pointer [RFC6901] 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 in Figure 4 illustrates this: example 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 media type. All IANA-registered elements indicate
indicate the version at which they got introduced or obsoleted. the version at which they were introduced or obsoleted.
1.9.1. Version Format and Requirements
A JSContact version consists of a numeric major and minor version,
separated by the FULL STOP character (U+002E). Later versions are
numerically higher than former versions, with the major version being
more significant than the minor version. A version value is produced
by the ABNF
jsversion = 1*DIGIT "." 1*DIGIT A JSContact version consists of a major and minor version.
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.1. Version Format and Requirements
A version value starts with the numeric major version, followed by
the FULL STOP character (U+002E), followed by the numeric minor
version. Later versions are numerically higher than former versions,
with the major version being more significant than the minor version.
A version value is produced by the following ABNF:
jsversion = 1*DIGIT "." 1*DIGIT
Figure 5: The ABNF for JSContact Version Values
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). The JSContact type of the Card object.
The value MUST be "Card".
This MUST be Card, if set.
2.1.2. version 2.1.2. version
Type: String (mandatory). version: String (mandatory). The JSContact version of this Card.
The value MUST be one of the IANA-registered JSContact Version
Specifies the JSContact version used to define this Card. The value values for the version property. Also see Section 1.9.2.
MUST be one of the IANA-registered JSContact Enum Values for the
version property. Also see Section 1.9.2.
"version": "1.0" "version": "1.0"
Figure 6: version example Figure 7: Example for the version Property
2.1.3. created 2.1.3. created
Type: UTCDateTime (optional). created: UTCDateTime (optional). The date and time when the Card was
created.
The date and time when this Card was created.
"created": "2022-09-30T14:35:10Z" "created": "2022-09-30T14:35:10Z"
Figure 7: created example
Figure 8: Example for the created Property
2.1.4. kind 2.1.4. kind
Type: String (optional, default: individual). The kind of the entity kind: String (optional; default: "individual"). The kind of the
the Card represents. entity the Card represents.
The enumerated (Section 1.7.4) values are: The enumerated (Section 1.7.5) 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: Example for the kind Property
2.1.5. language 2.1.5. language
Type: String (optional). language: String (optional). The language tag, as defined in
[RFC5646], that best describes the language used for text in the
This is the language tag, as defined in [RFC5646], that best Card, optionally including additional information such as the
describes the language used for text in the Card, optionally script. Note that values MAY be localized in the localizations
including additional information such as the script. Note that (Section 2.7.1) property.
values MAY be localized in the localizations property Section 2.7.1.
"language": "de-AT" "language": "de-AT"
Figure 9: language example Figure 10: Example for the language Property
2.1.6. members 2.1.6. members
Type: String[Boolean] (optional). members: String[Boolean] (optional). The set of Cards that are
members of this group Card. Each key in the set is the uid
This identifies the set of Cards that are members of this group Card. property value of the member, and each boolean value MUST be
Each key in the set is the uid property value of the member, each "true". If this property is set, then the value of the kind
boolean value MUST be true. If this property is set, then the value 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
required to. A group Card without the members property can be not 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: Example for the members Property
2.1.7. prodId 2.1.7. prodId
Type: String (optional). prodId: String (optional). The identifier for the product that
created the Card. If set, the value MUST be at least one
The identifier for the product that created the Card. If set, the 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: Example for the prodId Property
2.1.8. relatedTo 2.1.8. relatedTo
Type: String[Relation] (optional). relatedTo: String[Relation] (optional). The set of Card objects that
relate to the Card. The value is a map, where each key is the uid
property value of the related Card, and the value defines the
relation.
Relates the object to other Cards. This is represented as a map, The Relation object has the following properties:
where each key is the uid of the related Card and the value defines
the relation. The Relation object has the following properties:
* @type: String. This MUST be Relation, if set. @type: String. The JSContact type of the object. The value MUST be
"Relation", if set.
* relation: String[Boolean] (optional, default: empty Object) relation: String[Boolean] (optional; default: empty Object). The rel
Describes how the linked object is related to the linking object. ationship of the related Card to the Card, defined as a set of
The relation is defined as a set of relation types. The key in relation types. The keys in the set define the relation type; the
the set defines the relation type, the value for each key in the values for each key in the set MUST be "true". The relationship
set MUST be true. The relationship between the two objects is 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.5) 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: Example for the relatedTo Property
2.1.9. uid 2.1.9. uid
Type: String (mandatory). uid: String (mandatory). An identifier that associates the object as
the same across different systems, address books, and views. The
value SHOULD 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 the "uuid" namespace [RFC4122].
An identifier, used to associate the object as the same across As of this writing, a revision [UUID] of the Universally Unique
different systems, address books and views. The value SHOULD be a Identifier (UUID) Standards Track document [RFC4122] is in
URN [RFC8141] but for compatibility with [RFC6350] it MAY also be a progress and will likely introduce new UUID versions and best
URI [RFC3986] or free-text value. The value of the URN SHOULD be in practices to generate global unique identifiers. Implementors
the uuid namespace [RFC4122]. As of this writing, a revision SHOULD follow any recommendations described there. Until then,
[I-D.ietf-uuidrev-rfc4122bis] of the UUID standard document is being implementations SHOULD generate identifiers using the random or
worked on and is likely to introduce new UUID versions and best pseudorandom UUID version described in Section 4.4 of [RFC4122].
practices to generate global unique identifiers. Implementors SHOULD
follow any recommendations described there. Until then,
implementations SHOULD generate identifiers using the random or
pseudo-random 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: Example for the uid Property
2.1.10. updated 2.1.10. updated
Type: UTCDateTime (optional). updated: UTCDateTime (optional). The date and time when the data in
the Card was last modified.
The date and time when the data in this Card was last modified.
"updated": "2021-10-31T22:27:10Z" "updated": "2021-10-31T22:27:10Z"
Figure 14: updated example Figure 15: Example for the updated Property
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). name: Name (optional). The name of the entity represented by the
Card. This can be any type of name, e.g., it can, but need not,
The name of the entity represented by this Card. This can be any be the legal name of a person.
type of name, e.g., it can but need not be the legal name of a
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. The JSContact type of the object. The value 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. The components property
if the full property is not set, otherwise it SHOULD be set. The MUST be set if the full property is not set; otherwise, it SHOULD
component list MUST have at least one entry having a different be set. The component list MUST have at least one entry having a
kind than separator. different kind property value 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 with the kind property value set to
what characters to insert between components, but implementations "separator" give guidance on what characters to insert between
are free to choose any others. In lack of a separator, inserting components, but implementations are free to choose any others.
a single Space character in between name component values is a When lacking a separator, inserting a single space character in
good choice. between the name component 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 with the kind property
the defaultSeparator property MUST NOT be set. value set to "separator", and 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"). The indicator if
the name component sequence in the components property is ordered. the name components in the components property are ordered.
* defaultSeparator: String (optional). The default separator to defaultSeparator: String (optional). The default separator to insert
insert between name component values when concatenating all name 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 kind property value "separator" for the NameComponent
MUST NOT be set if the Name isOrdered property value is false or (Section 2.2.1.2) object. The defaultSeparator property MUST NOT
if the components property is not set. be set if the Name isOrdered property value 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 The full property MUST be set if the components property is not
is not set. set.
"full": "Mr. John Q. Public, Esq." "full": "Mr. John Q. Public, Esq."
Figure 17: full example Figure 18: Example for the full Property
* sortAs: String[String] (optional).
This defines how this name lexicographically sorts in relation to sortAs: String[String] (optional). The value to lexicographically
other names when compared by a name component type. The key in sort the name in relation to other names when compared by a name
the map defines the name component type. The value for that key component type. The keys in the map define the name component
defines the verbatim string to compare when sorting by this name type. The values define the verbatim string to compare when
component type. Absence of a key indicates that this name sorting by the name component type. Absence of a key indicates
component type SHOULD NOT be considered during sort. Sorting by that the name component type SHOULD NOT be considered during sort.
that missing name component type or if the sortAs property is not Sorting by that missing name component type, or if the sortAs
set is implementation-specific. This property MUST NOT be set if property is not set, is implementation-specific. The sortAs
the components property is not set. 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 the sortAs property. The
indicates that the middle name followed by both surnames should be property value indicates that the middle name followed by both
used when sorting this name by surname. The absence of the middle surnames should be used when sorting the name by surname. The
indicates that the middle name on its own should be disregarded absence of "middle" indicates that the middle name on its own
during sort. Even though the name only contains one name should be disregarded during sort. Even though the name only
component for the given name, the sortAs property still explicitly contains one name component for the given name, the sortAs
defines how to sort by given name as otherwise sorting by it would property still explicitly defines how to sort by the given name;
be undefined. otherwise, sorting by it 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.4 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.4 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: Example for the sortAs Property
{ {
"@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 1266
"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: Example for the phonetic and localizations Properties
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. The JSContact type of the object. The value 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.5) 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). The pronounciation of 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.4.
2.2.1.3. nicknames 2.2.2. nicknames
Type: Id[Nickname] (optional). nicknames: Id[Nickname] (optional). The nicknames of the entity
represented by the Card.
The nicknames of the entity represented by this Card. A Nickname A Nickname object has the following properties:
object has the following properties:
* @type: String. This MUST be Nickname, if set. @type: String. The JSContact type of the object. The value 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.3.
"nicknames": { "nicknames": {
"k391": { "k391": {
"name": "Johnny" "name": "Johnny"
} }
} }
Figure 20: nicknames example Figure 21: Example for the nicknames Property
2.2.2. organizations 2.2.3. organizations
Type: Id[Organization] (optional). organizations: Id[Organization] (optional). The company or
organization names and units associated with the Card.
The companies or organizations names and units associated with this An Organization object has the following properties, of which at
Card. An Organization object has the following properties, of which least one of the name and units properties MUST be set:
at least one of the name and units properties MUST be set:
* @type: String. This MUST be Organization, if set. @type: String. The JSContact type of the object. The value 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
ordered descending by hierarchy (e.g., a geographic or functional as descending by hierarchy (e.g., a geographic or functional
division sorts before a department within that division). If set, division sorts before a department within that division). If set,
the list MUST contain at least one entry. the list MUST contain at least one entry.
* sortAs: String (optional). This defines how this organization sortAs: String (optional). The value to lexicographically sort the
name lexicographically sorts in relation to other organizations organization in relation to other organizations when compared by
when compared by name. The value defines the verbatim string name. The value defines the verbatim string value to compare. In
value to compare. In absence of this property, the name property absence of this property, the name property value MAY be used for
value MAY be used for comparison. 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 applies. For example,
in a choir may only apply in a private context. Also see membership in a choir may only apply in a private context. Also
Section 1.5.1. see 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. The JSContact type of the object. The value 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). The value to lexicographically sort the
unit name lexicographically sorts in relation to other organizational unit in relation to other organizational units of
organizational units of the same level when compared by name. The the same level when compared by name. The level is defined by the
level is defined by the array index of this organizational unit in array index of the organizational unit in the units property of
the units property of the Organization object. The property value the Organization object. The property value defines the verbatim
defines the verbatim string value to compare. In absence of this string value to compare. In absence of this property, the name
property, the name property value MAY be used for comparison. 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: Example for the organizations Property
2.2.3. speakToAs
Type: SpeakToAs (optional).
Provides information how to address, speak to or refer to the entity
that is represented by this Card. A SpeakToAs object has the
following properties, of which at least one of the grammaticalGender
and pronouns properties MUST be set:
* @type: String. This MUST be SpeakToAs, if set.
* grammaticalGender: String (optional). Defines which grammatical
gender to use in salutations and other grammatical constructs.
For example, the German language distinguishes by grammatical
gender in salutations such as "Sehr geehrte" (feminine) and "Sehr
geehrter" (masculine). The enumerated (Section 1.7.4) values are:
- animate 2.2.4. speakToAs
- common speakToAs: SpeakToAs (optional). The information how to address,
speak to, or refer to the entity that is represented by the Card.
- feminine A SpeakToAs object has the following properties, of which at least
one of the grammaticalGender and pronouns properties MUST be set:
- inanimate @type: String. The JSContact type of the object. The value MUST be
"SpeakToAs", if set.
- masculine grammaticalGender: String (optional). The grammatical gender to use
in salutations and other grammatical constructs. For example, the
German language distinguishes by grammatical gender in salutations
such as "Sehr geehrte" (feminine) and "Sehr geehrter" (masculine).
The enumerated (Section 1.7.5) values are:
- neuter * animate
* common
* feminine
* 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). The pronouns that the contact
contact chooses to use for themselves. 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. The JSContact type of the object. The value MUST be
"Pronouns", if set.
* pronouns: String (mandatory). Defines the pronouns. Any value or pronouns: String (mandatory). The pronouns. Any value or form is
form is allowed. Examples in English include she/her and allowed. Examples in English include "she/her" and "they/them/
they/them/theirs. The value MAY be overridden in the theirs". The value MAY be overridden in the localizations
localizations property (Section 2.7.1). (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.3.
"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: Example for the speakToAs Property
2.2.4. titles
Type : Id[Title] (optional). 2.2.5. titles
The job titles or functional positions of the entity represented by titles: Id[Title] (optional). The job titles or functional positions
this Card. A Title object has the following properties: of the entity represented by the Card.
* @type: String. This MUST be Title, if set. A Title object has the following properties:
* name: String (mandatory). The title or role name of the entity @type: String. The JSContact type of the object. The value MUST be
represented by this Card. "Title", if set.
* kind: String (optional, default title). Describes the name: String (mandatory). The title or role name of the entity
organizational or situational kind of this title. Some represented by the Card.
organizations and individuals distinguish between _titles_ as
organizational positions and _roles_ as more temporary
assignments, such as in project management.
The enumerated (Section 1.7.4) values are: kind: String (optional; default: "title"). The organizational or
situational kind of the title. Some organizations and individuals
distinguish between _titles_ as organizational positions and
_roles_ as more temporary assignments such as in project
management.
- title The enumerated (Section 1.7.5) values are:
- role * title
* role
* organizationId: Id (optional). The identifier of the organization organizationId: Id (optional). The identifier of the organization in
in which this title is held. 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: Example for the titles Property
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). emails: Id[EmailAddress] (optional). The email addresses in which to
contact the entity represented by the Card.
The email addresses to contact the entity represented by this Card.
An EmailAddress object has the following properties: An EmailAddress object has the following properties:
* @type: String. This MUST be EmailAddress, if set. @type: String. The JSContact type of the object. The value 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 in
address in relation to other email addresses. Also see relation to other email addresses. Also see Section 1.5.3.
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.2.
"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: Example for the emails Property
2.3.2. onlineServices 2.3.2. onlineServices
Type: Id[OnlineService] (optional). onlineServices: Id[OnlineService] (optional). The online services
that are associated with the entity represented by the Card. This
can be messaging services, social media profiles, and other.
The online services that are associated with the entity represented An OnlineService object has the following properties, of which at
by this Card. This can be messaging services, social media profiles, least the uri or user property MUST be set:
and other. An OnlineService object has the following properties, of
which at least the uri or user property MUST be set:
* @type: String. This MUST be OnlineService, if set. @type: String. The JSContact type of the object. The value 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). The identifier for the entity represented by
this card at the online service. This MUST be a _URI_ as defined the Card at the online service. This MUST be a _URI_ as defined
in Section 3 of [RFC3986]. in Section 3 of [RFC3986].
* user: String (optional). This names the entity represented by user: String (optional). The name 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.3.
* 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.2.
"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: Example for the onlineServices Property
2.3.3. phones 2.3.3. phones
Type: Id[Phone] (optional). phones: Id[Phone] (optional). The phone numbers by which to contact
the entity represented by the Card.
The phone numbers to contact the entity represented by this Card. A
Phone object has the following properties: Phone object has the following properties:
* @type: String. This MUST be Phone, if set. @type: String. The JSContact type of the object. The value 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
free-text. Typical URI schemes are the [RFC3966] tel or [RFC3261] text. Typical URI schemes are "tel" [RFC3966] or "sip" [RFC3261],
sip schemes, but any URI scheme is allowed. 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.5) method type values
are: are:
- mobile: the number is for a mobile phone. * mobile: this number is for a mobile phone.
* voice: this number supports calling by voice.
- voice: the number is for calling by voice. * text: this number supports text messages (SMS).
* video: this number supports video conferencing.
- text: the number supports text messages (SMS). * main-number: this number is a main phone number such as the
number of the front desk at a company, as opposed to a direct-
- video: the number supports video conferencing.
- 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. dial number of an individual employee.
* textphone: this number is for a device for people with hearing
- textphone: the number is for a device for people with hearing
or speech difficulties. or speech difficulties.
* fax: this number supports sending faxes.
* pager: this number is 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.3.
* 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.2.
"phones": { "phones": {
"tel0": { "tel0": {
"contexts": { "contexts": {
"private": true "private": true
}, },
"features": { "features": {
"voice": true "voice": true
}, },
"number": "tel:+1-555-555-5555;ext=5555", "number": "tel:+1-555-555-5555;ext=5555",
"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: Example for the phones Property
2.3.4. preferredLanguages 2.3.4. preferredLanguages
Type : Id[LanguagePref] (optional). preferredLanguages : Id[LanguagePref] (optional). The preferred
languages for contacting the entity associated with the Card.
Defines the preferred languages for contacting the entity associated
with this 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. The JSContact type of the object. The value 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). The contexts in which to use
which to use this language. Also see Section 1.5.1. the language. Also see Section 1.5.1.
* pref: UnsignedInt (optional). Defines the preference of this pref: UnsignedInt (optional). The preference of the language in
language in relation to other languages of the same contexts. relation to other languages of the same contexts. Also see
Also see Section 1.5.4. Section 1.5.3.
"preferredLanguages": { "preferredLanguages": {
"l1": { "l1": {
"language": "en", "language": "en",
"contexts": { "contexts": {
"work": true "work": true
}, },
"pref": 1 "pref": 1
}, },
"l2": { "l2": {
skipping to change at page 37, line 49 skipping to change at line 1704
"pref": 2 "pref": 2
}, },
"l3": { "l3": {
"language": "fr", "language": "fr",
"contexts": { "contexts": {
"private": true "private": true
} }
} }
} }
Figure 27: preferredLanguages example Figure 28: Example for the preferredLanguages Property
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). calendars: Id[Calendar] (optional). The calendaring resources of the
entity represented by the Card, such as to look up free-busy
information.
These are resources for calendaring, such as calendars to lookup A Calendar object has all properties of the Resource (Section 1.4.4)
free-busy information for the entity represented by this Card. A
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.5)
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: Example for the calendars Property
2.4.2. schedulingAddresses 2.4.2. schedulingAddresses
Type: Id[SchedulingAddress] (optional). schedulingAddresses: Id[SchedulingAddress] (optional). The
scheduling addresses by which the entity may receive calendar
scheduling invitations.
The scheduling addresses by which the entity may receive calendar A SchedulingAddress object has the following properties:
scheduling invitations. A SchedulingAddress object has the following
properties:
* @type: String. This MUST be SchedulingAddress, if set. @type: String. The JSContact type of the object. The value 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.3.
* label: String (optional). A custom label for the scheduling label: String (optional). A custom label for the scheduling address.
address, see Section 1.5.3. Also see Section 1.5.2.
"schedulingAddresses": { "schedulingAddresses": {
"sched1": { "sched1": {
"uri": "mailto:janedoe@example.com" "uri": "mailto:janedoe@example.com"
} }
} }
Figure 29: schedulingAddresses example Figure 30: Example for the schedulingAddresses Property
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). addresses: Id[Address] (optional). The addresses of the entity
represented by the Card, such as postal addresses or geographic
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. The JSContact type of the object. The value 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 property value other
The component list MUST have at least one entry having a different than "separator".
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 with the kind property value set
what characters to insert between components, but implementations to "separator" give guidance on what characters to insert between
are free to choose any others. In lack of a separator, inserting components, but implementations are free to choose any others.
a single Space character in between address component values is a When lacking a separator, inserting a single space character in
good choice. between address component 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 with the kind
the defaultSeparator property MUST NOT be set. property value set to "separator", and the defaultSeparator
property MUST NOT be set.
* isOrdered: Boolean (optional, default: false). This indicates if isOrdered: Boolean (optional; default: "false"). The indicator if
the address component sequence in the components property is the address components in the components property are 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). The time zone in which the address is
address is located in. This MUST be a time zone name registered located. This MUST be a time zone name registered in the IANA
in the IANA Time Zone Database [IANATZ]. Time Zone Database [IANA-TZ].
* contexts: String[Boolean] (optional). The contexts of the address
information. The boolean value MUST be true. In addition to the
common contexts (Section 1.5.1), allowed key values are:
- billing: an address to be used for billing. contexts: String[Boolean] (optional). The contexts in which to use
this address. The boolean value MUST be "true". In addition to
the common contexts (Section 1.5.1), allowed key values are:
- delivery: an address to be used for delivering physical items. * billing: an address to be used for billing.
* 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, region,
street, region or country. The purpose of this property is to or country. The purpose of this property is to define an address,
define an address, even if the individual address components are 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
insert between address component values when concatenating all between address component values when concatenating all address
address component values to a single String. Also see the component values to a single String. Also see the definition of
definition of the separator kind for the AddressComponent object. the kind property value "separator" for the AddressComponent
This property MUST NOT be set if the Address isOrdered property (Section 2.5.1.2) object. The defaultSeparator property MUST NOT
value is false or if the components property is not set. be set if the 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.3.
* 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 the AddressComponent phonetic property. Also see Section 1.5.4.
Section 1.5.5.
* phoneticSystem: String (optional). The phonetic system used in phoneticSystem: String (optional). The phonetic system used in the
the AddressComponent phonetic property. Also see Section 1.5.5. AddressComponent phonetic property. Also see Section 1.5.4.
The following example illustrates the use of the address property. The following example illustrates the use of the address property for
Additional examples are in Section 2.5.1.3. "54321 Oak St, Reston, CA 20190, USA". 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 1885
{ "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 an Address in the 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. The JSContact type of the object. The value 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.5) 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). The pronounciation of 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.4.
2.5.1.3. Address examples 2.5.1.3. Additional Address Examples
The following are examples of addresses, in addition to Figure 30. The following example illustrates the use of the address property for
"46, 1 Sukhumvit 51 Alley, Khlong Tan Nuea, Watthana, Bangkok 10110,
Thailand".
"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 an Address in Thailand
Khlong Tan Nuea, Watthana, Bangkok 10110, Thailand"
The following example illustrates the use of the address property for
"2-7-2 Marunouchi, Chiyoda-ku, Tokyo 100-8994" and its Japanese
localization (Section 2.7.1).
"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" },
skipping to change at page 44, line 42 skipping to change at line 2007
{ "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). cryptoKeys: Id[CryptoKey] (optional). The cryptographic resources
such as public keys and certificates associated with the entity
represented by the Card.
These are cryptographic resources such as public keys and A CryptoKey object has all properties of the Resource (Section 1.4.4)
certificates associated with the entity represented by this Card. A data type, with the following additional definition:
CryptoKey object has all properties of the Resource (Section 1.4.4)
data type, with the following additional definitions:
* 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). directories: Id[Directory] (optional). The directories containing
information about the entitity represented by the Card.
These are directory service resources, such as entries in a directory A Directory object has all properties of the Resource (Section 1.4.4)
or organizational directories for lookup. A Directory object has all data type, with the following additional definitions:
properties of the Resource (Section 1.4.4) data type, with the
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.5)
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). The position of the directory
directory resource in the list of all Directory objects having the resource in the list of all Directory objects having the same kind
same kind in this Card. If set, the listAs value MUST be higher property value in the Card. If set, the listAs value MUST be
than zero. Multiple directory resources MAY have the same listAs higher than zero. Multiple directory resources MAY have the same
property value, or none. Sorting such entries is implementation- listAs property value or none. Sorting such same-valued entries
specific. is implementation-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: Example for the directories Property
2.6.3. links 2.6.3. links
Type: Id[Link] (optional). links: Id[Link] (optional). The links to resources that do not fit
any of the other use-case-specific resource properties.
These are links to resources that do not fit any of the other use- A Link object has all properties of the Resource (Section 1.4.4) data
case specific resource properties. A Link object has all properties type, with the following additional definitions:
of the Resource (Section 1.4.4) data type, with the following
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.5)
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: Example for the links Property
2.6.4. media 2.6.4. media
Type: Id[Media] (optional). media: Id[Media] (optional). The media resources such as
photographs, avatars, or sounds that are associated with the
entity represented by the Card.
These are media resources such as photographs, avatars, or sounds A Media object has all properties of the Resource (Section 1.4.4)
associated with the entity represented by this Card. A Media object data type, with the following additional definitions:
has all properties of the Resource (Section 1.4.4) data type, 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.5)
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: Example for the media Property
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). localizations: String[PatchObject] (optional). The property values
localized to languages other than the main language
This localizes property values in this Card to languages other than (Section 2.1.5) of the Card. Localizations provide language-
the main language. Localizations provide language-specific specific alternatives for existing property values and SHOULD NOT
alternatives for existing property values and SHOULD NOT add new add new properties. The keys in the localizations property value
properties. are language tags [RFC5646]; the values are of type PatchObject
and localize the Card in that language tag. The paths in the
The keys in the localizations property object are language tags PatchObject are relative to the Card that includes the
[RFC5646]. The values are patch objects which localize the Card in localizations property. A patch MUST NOT target the localizations
the respective language tag. The paths in the PatchObject are property.
relative to the Card that includes the localizations property. A
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 2235
{ "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": "escritor"
} }
} }
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). anniversaries: Id[Anniversary] (optional). The memorable dates and
events for the entity represented by the Card.
These are memorable dates and events for the entity represented by
this 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 An Anniversary object has the following properties:
- death: a deathday anniversary @type: String. The JSContact type of the object. The value MUST be
"Anniversary", if set.
- wedding: a wedding day anniversary kind: String (mandatory). The kind of anniversary. The enumerated
(Section 1.7.5) 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). T
either be a whole or partial calendar date or a complete UTC he 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:
set:
* @type: String. This MUST be PartialDate, if set. @type: String. The JSContact type of the object. The value 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 the year or the day property 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 the month property
month MUST be set. 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. The JSContact type of the object. The value MUST be
"Timestamp", if set.
* utc: UTCDateTime (mandatory). Specifies the point in time in UTC utc: UTCDateTime (mandatory). 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 2348
"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: Example for the anniversaries Property
2.8.2. keywords 2.8.2. keywords
Type: String[Boolean] (optional). A set of free-text keywords, also keywords: String[Boolean] (optional). The set of free-text keywords,
known as _tags_. The set is represented as an object, with each key also known as _tags_. Each key in the set is a keyword, each
being a keyword. The boolean value MUST be true. boolean value MUST be "true".
"keywords": { "keywords": {
"internet": true, "internet": true,
"IETF": true "IETF": true
} }
Figure 41: keywords example Figure 42: Example for the keywords Property
2.8.3. notes 2.8.3. notes
Type: Id[Note] (optional). notes: Id[Note] (optional). The free-text notes that are associated
with the Card.
Free-text notes associated with this Card. A Note object has the A Note object has the following properties:
following properties:
* @type: String. This MUST be Note, if set. @type: String. The JSContact type of the object. The value 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. The JSContact type of the object. The value 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). The 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: Example for the notes Property
2.8.4. personalInfo 2.8.4. personalInfo
Type: Id[PersonalInfo] (optional). personalInfo: Id[PersonalInfo] (optional). The personal information
of the entity represented by the Card.
Defines personal information about the entity represented by this 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. The JSContact type of the object. The value MUST be
"PersonalInfo", if set.
* kind: String (mandatory). Specifies the kind of this personal kind: String (mandatory). The kind of personal information. The
information. The enumerated (Section 1.7.4) values are: enumerated (Section 1.7.5) 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). The level of expertise or engagement in
engagement in hobby or interest. The enumerated (Section 1.7.4) hobby or interest. The enumerated (Section 1.7.5) values are:
values are:
- high * high
- medium * medium
- low * low
* listAs: UnsignedInt (optional). This defines the position of this listAs: UnsignedInt (optional). The position of the personal
personal information in the list of all PersonalInfo objects information in the list of all PersonalInfo objects that have the
having the same kind in this Card. If set, the listAs value MUST same kind property value in the Card. If set, the listAs value
be higher than zero. Multiple personal information entries MAY MUST be higher than zero. Multiple personal information entries
have the same listAs property value, or none. Sorting such MAY have the same listAs property value or none. Sorting such
entries is implementation-specific. same-valued entries is implementation-specific.
* label: String (optional). A custom label. See Section 1.5.3. label: String (optional). A custom label. See Section 1.5.2.
"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: Example for the personalInfo Property
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",
obsolete. or "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
added by up-to-date systems. A new assignment has probably been be added by up-to-date systems. A new assignment has probably
defined covering the obsolete item's semantics. been 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 DE 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, entries with equal "Major Version" sort
numerically in ascending order by the "Minor 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 Property Name: The name of the property. The property name MUST NOT
MUST NOT already be registered for any of the object types listed already be registered for any of the object types listed in the
in the "Property Context" field of this registration. Other "Property Context" field of this registration. Other object types
object types MAY already have registered a different property with MAY have already registered a different property with the same
the same name; however, the same name MUST only be used when the name; however, the same name MUST only be used when the semantics
semantics are analogous. are analogous.
Property Type: This is the type of this property, using type Property Type: For properties with intended usage other than
signatures, as specified in Section 1.3.2. The property type MUST "reserved", this is the type of this property, using type
be registered in the "JSContact Types" registry. 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".
Property Context: This is a comma-separated list of JSContact object Property Context: A comma-separated list of JSContact object types
types (Section 3.6.2) that contain this property. (Section 3.6.2) that contain the property. For reserved property
names, the value MAY be the verbatim string "not applicable".
Reference or Description: This is a brief description or RFC number Intended Usage: May be "common", "reserved", or "obsolete".
and section reference where the property is specified (omitted for
"reserved" property names). This must include references to all
RFC documents where this property is introduced or updated.
Intended Usage: This may be "common", "reserved", or "obsolete". Since Version: The JSContact version on which the property
definition is based. The version MUST be one of the allowed
values of the version property in the "JSContact Version" registry
(see Table 1).
Since Version: This defines the JSContact version on which this Until Version: The JSContact version after which the property was
property definition is based on. The version MUST be one of the obsoleted; therefore, it MUST NOT be used in later versions. The
allowed values of the version property in the JSContact Enum Value Until Version value either MUST NOT be set or MUST be one of the
allowed values of the version property in the "JSContact Version"
registry (see Table 1). registry (see Table 1).
Until Version: This defines the JSContact version after which this Change Controller: Person or entity responsible for requesting a
property got obsoleted and MUST NOT be used in later versions. change to the entry's definition ("IETF" for RFCs from the IETF
The Until Version value either MUST NOT be set, or be one of the stream).
allowed values of the version property in the JSContact Enum Value
registry (see Table 1).
Change Controller: This is who may request a change to this entry's Reference or Description: A brief description or RFC number and
definition (IETF for RFCs from the IETF stream). 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 for the "JSContact Properties" Registry 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 |
| | | |Description | +=====================+=======================+====================+
+===================+=====================+=========================+============+ | @type | String | Address |
|@type |String |Address, |Section | | | | (Section 2.5.1.1), |
| | |AddressComponent, |2.5.1, | | | | AddressComponent |
| | |Anniversary, Author, |Section | | | | (Section 2.5.1.2), |
| | |Card, Calendar, |2.8.1, | | | | Anniversary |
| | |CryptoKey, Directory, |Section | | | | (Section 2.8.1), |
| | |EmailAddress, |2.1.1, | | | | Author |
| | |LanguagePref, Link, |Section | | | | (Section 2.8.3), |
| | |Media, Name, |2.4.1, | | | | Card |
| | |NameComponent, Nickname, |Section | | | | (Section 2.1.1), |
| | |Note, OnlineService, |2.6.1, | | | | Calendar |
| | |Organization, OrgUnit, |Section | | | | (Section 2.4.1), |
| | |PartialDate,PersonalInfo,|2.6.2, | | | | CryptoKey |
| | |Phone, Pronouns, |Section | | | | (Section 2.6.1), |
| | |Relation, |2.3.1, | | | | Directory |
| | |SchedulingAddress, |Section | | | | (Section 2.6.2), |
| | |SpeakToAs, Timestamp, |2.3.4, | | | | EmailAddress |
| | |Title |Section | | | | (Section 2.3.1), |
| | | |2.6.3, | | | | LanguagePref |
| | | |Section | | | | (Section 2.3.4), |
| | | |2.6.4, | | | | Link |
| | | |Section | | | | Section 2.6.3), |
| | | |2.2.1, | | | | Media |
| | | |Section | | | | (Section 2.6.4), |
| | | |2.2.1.3, | | | | Name |
| | | |Section | | | | (Section 2.2.1.1), |
| | | |2.8.3, | | | | NameComponent |
| | | |Section | | | | (Section 2.2.1.2), |
| | | |2.3.2, | | | | Nickname |
| | | |Section | | | | (Section 2.2.2), |
| | | |2.2.2, | | | | Note |
| | | |Section | | | | (Section 2.8.3), |
| | | |2.8.4, | | | | OnlineService |
| | | |Section | | | | (Section 2.3.2), |
| | | |2.3.3, | | | | Organization |
| | | |Section | | | | (Section 2.2.3), |
| | | |2.2.3, | | | | OrgUnit |
| | | |Section | | | | (Section 2.2.3), |
| | | |2.1.8, | | | | PartialDate |
| | | |Section | | | | (Section 2.8.1), |
| | | |2.4.2, | | | | PersonalInfo |
| | | |Section | | | | (Section 2.8.4), |
| | | |2.2.4 | | | | Phone |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.3.3), |
|version |String |Card |Section | | | | Pronouns |
| | | |2.1.2 | | | | (Section 2.2.4), |
+-------------------+---------------------+-------------------------+------------+ | | | Relation |
|address |String |EmailAddress |Section | | | | (Section 2.1.8), |
| | | |2.3.1 | | | | SchedulingAddress |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.4.2), |
|addresses |Id[Address] |Card |Section | | | | SpeakToAs |
| | | |2.5.1 | | | | (Section 2.2.4), |
+-------------------+---------------------+-------------------------+------------+ | | | Timestamp |
|anniversaries |Id[Anniversary] |Card |Section | | | | (Section 2.8.1), |
| | | |2.8.1 | | | | Title |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.2.5) |
|author |Author |Note |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.3 | | address | String | EmailAddress |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.3.1) |
|calendars |Id[Calendar] |Card |Section | +---------------------+-----------------------+--------------------+
| | | |2.4.1 | | addresses | Id[Address] | Card |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.5.1.1) |
|calendarScale |String |PartialDate |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.1 | | anniversaries | Id[Anniversary] | Card |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.1) |
|components |AddressComponent[] |Address |Section | +---------------------+-----------------------+--------------------+
| | | |2.5.1 | | author | Author | Note |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.3) |
|components |NameComponent[] |Name |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.1 | | calendars | Id[Calendar] | Card |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.4.1) |
|contexts |String[Boolean] |Address, Calendar, |Section | +---------------------+-----------------------+--------------------+
| | |CryptoKey, Directory, |1.5.1, | | calendarScale | String | PartialDate |
| | |EmailAddress, |Section | | | | (Section 2.8.1) |
| | |LanguagePref, Link, |2.5.1, | +---------------------+-----------------------+--------------------+
| | |Media, Nickname, |Section | | components | AddressComponent[] | Address |
| | |OnlineService, |2.4.1, | | | | (Section 2.5.1.1) |
| | |Organization, Phone, |Section | +---------------------+-----------------------+--------------------+
| | |Pronouns, |2.6.1, | | components | NameComponent[] | Name |
| | |SchedulingAddress |Section | | | | (Section 2.2.1.2) |
| | | |2.6.2, | +---------------------+-----------------------+--------------------+
| | | |Section | | contexts | String[Boolean] | Address |
| | | |2.3.1, | | | | (Section 2.5.1.1), |
| | | |Section | | | | Calendar |
| | | |2.3.4, | | | | (Section 2.4.1), |
| | | |Section | | | | CryptoKey |
| | | |2.6.3, | | | | (Section 2.6.1), |
| | | |Section | | | | Directory |
| | | |2.6.4, | | | | (Section 2.6.2), |
| | | |Section | | | | EmailAddress |
| | | |2.2.1.3, | | | | (Section 2.3.1), |
| | | |Section | | | | LanguagePref |
| | | |2.3.2, | | | | (Section 2.3.4), |
| | | |Section | | | | Link |
| | | |2.2.2, | | | | (Section 2.6.3), |
| | | |Section | | | | Media |
| | | |2.3.3, | | | | (Section 2.6.4), |
| | | |Section | | | | Nickname |
| | | |2.2.3, | | | | (Section 2.2.2), |
| | | |Section | | | | OnlineService |
| | | |2.4.2Section| | | | (Section 2.3.2), |
| | | |1.4.4 | | | | Organization |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.2.3), |
|coordinates |String |Address |Section | | | | Phone |
| | | |2.5.1 | | | | (Section 2.3.3), |
+-------------------+---------------------+-------------------------+------------+ | | | Pronouns |
|countryCode |String |Address |Section | | | | (Section 2.2.4), |
| | | |2.5.1 | | | | SchedulingAddress |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.4.2). |
|created |UTCDateTime |Card, Note |Section | | | | Also see Sections |
| | | |2.1.3, | | | | 1.4.4 and 1.5.1. |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.3 | | coordinates | String | Address |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.5.1.1) |
|date |PartialDate|Timestamp|Anniversary |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.1 | | countryCode | String | Address |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.5.1.1) |
|day |UnsignedInt |PartialDate |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.1 | | created | UTCDateTime | Card |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.1.3), |
|defaultSeparator |String |Address, Name |Section | | | | Note |
| | | |2.5.1, | | | | (Section 2.8.3) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.1 | | date | PartialDate|Timestamp | Anniversary |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.1) |
|directories |Id[Directory] |Card |Section | +---------------------+-----------------------+--------------------+
| | | |2.6.2 | | day | UnsignedInt | PartialDate |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.1) |
|emails |Id[EmailAddress] |Card |Section | +---------------------+-----------------------+--------------------+
| | | |2.3.1 | | defaultSeparator | String | Address |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.5.1.1), |
|features |String[Boolean] |Phone |Section | | | | Name |
| | | |2.3.3 | | | | (Section 2.2.1.1) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|full |String |Address, Name |Section | | directories | Id[Directory] | Card |
| | | |2.5.1, | | | | (Section 2.6.2) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.1 | | emails | Id[EmailAddress] | Card |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.3.1) |
|grammaticalGender |String |SpeakToAs |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.3 | | features | String[Boolean] | Phone |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.3.3) |
|isOrdered |Boolean |Address, Name |Section | +---------------------+-----------------------+--------------------+
| | | |2.5.1, | | full | String | Address |
| | | |Section | | | | (Section 2.5.1.1), |
| | | |2.2.1 | | | | Name |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.2.1.1) |
|keywords |String[Boolean] |Card |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.2 | | grammaticalGender | String | SpeakToAs |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.2.4) |
|kind |String |AddressComponent, |Section | +---------------------+-----------------------+--------------------+
| | |Anniversary, Calendar, |2.5.1, | | isOrdered | Boolean | Address |
| | |Card, CryptoKey, |Section | | | | (Section 2.5.1.1), |
| | |Directory, Link, Media, |2.8.1, | | | | Name |
| | |NameComponent, |Section | | | | (Section 2.2.1.1) |
| | |PersonalInfo, Title |2.4.1, | +---------------------+-----------------------+--------------------+
| | | |Section | | keywords | String[Boolean] | Card |
| | | |2.1.4, | | | | (Section 2.8.2) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.6.1, | | kind | String | AddressComponent |
| | | |Section | | | | (Section 2.5.1.2), |
| | | |2.6.2, | | | | Anniversary |
| | | |Section | | | | (Section 2.8.1), |
| | | |2.6.3, | | | | Calendar |
| | | |Section | | | | (Section 2.4.1), |
| | | |2.6.4, | | | | Card |
| | | |Section | | | | (Section 2.1.4), |
| | | |2.2.1, | | | | CryptoKey |
| | | |Section | | | | (Section 2.6.1), |
| | | |2.8.4, | | | | Directory |
| | | |Section | | | | (Section 2.6.2), |
| | | |2.2.4 | | | | Link |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.6.3), |
|label |String |Calendar, CryptoKey, |Section | | | | Media |
| | |Directory, EmailAddress, |1.5.3, | | | | (Section 2.6.4), |
| | |Link, Media, |Section | | | | NameComponent |
| | |OnlineService, |2.4.1, | | | | (Section 2.2.1.2), |
| | |PersonalInfo, Phone, |Section | | | | PersonalInfo |
| | |SchedulingAddress |2.6.1, | | | | (Section 2.8.4), |
| | | |Section | | | | Title |
| | | |2.6.2, | | | | (Section 2.2.5) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.3.1, | | label | String | Calendar |
| | | |Section | | | | (Section 2.4.1), |
| | | |2.6.3, | | | | CryptoKey |
| | | |Section | | | | (Section 2.6.1), |
| | | |2.6.4, | | | | Directory |
| | | |Section | | | | (Section 2.6.2), |
| | | |2.3.2, | | | | EmailAddress |
| | | |Section | | | | (Section 2.3.1), |
| | | |2.8.4, | | | | Link |
| | | |Section | | | | (Section 2.6.3), |
| | | |2.3.3, | | | | Media |
| | | |Section | | | | (Section 2.6.4), |
| | | |2.4.2, | | | | OnlineService |
| | | |Section | | | | (Section 2.3.2), |
| | | |1.4.4 | | | | PersonalInfo |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.4), |
|language |String |Card, LanguagePref |Section | | | | Phone |
| | | |2.1.5, | | | | (Section 2.3.3), |
| | | |Section | | | | SchedulingAddress |
| | | |2.3.4 | | | | (Section 2.4.2). |
+-------------------+---------------------+-------------------------+------------+ | | | Also see Sections |
|level |String |PersonalInfo |Section | | | | 1.4.4 and 1.5.2. |
| | | |2.8.4 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | language | String | Card |
|links |Id[Link] |Card |Section | | | | (Section 2.1.5), |
| | | |2.6.3 | | | | LanguagePref |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.3.4) |
|listAs |UnsignedInt |Directory, PersonalInfo |Section | +---------------------+-----------------------+--------------------+
| | | |2.6.2, | | level | String | PersonalInfo |
| | | |Section | | | | (Section 2.8.4) |
| | | |2.8.4 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | links | Id[Link] | Card |
|localizations |String[PatchObject] |Card |Section | | | | (Section 2.6.3) |
| | | |2.7.1 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | listAs | UnsignedInt | Directory |
|media |Id[Media] |Card |Section | | | | (Section 2.6.2), |
| | | |2.6.4 | | | | PersonalInfo |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.4) |
|mediaType |String |Calendar, CryptoKey, |Section | +---------------------+-----------------------+--------------------+
| | |Directory, Link, Media |1.4.4, | | localizations | String[PatchObject] | Card |
| | | |Section | | | | (Section 2.7.1) |
| | | |2.4.1, | +---------------------+-----------------------+--------------------+
| | | |Section | | media | Id[Media] | Card |
| | | |2.6.1, | | | | (Section 2.6.4) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.6.2, | | mediaType | String | Calendar |
| | | |Section | | | | (Section 2.4.1), |
| | | |2.6.3, | | | | CryptoKey |
| | | |Section | | | | (Section 2.6.1), |
| | | |2.6.4 | | | | Directory |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.6.2), |
|members |String[Boolean] |Card |Section | | | | Link |
| | | |2.1.6 | | | | (Section 2.6.3), |
+-------------------+---------------------+-------------------------+------------+ | | | Media |
|month |UnsignedInt |PartialDate |Section | | | | (Section 2.6.4). |
| | | |2.8.1 | | | | Also see |
+-------------------+---------------------+-------------------------+------------+ | | | Section 1.4.4. |
|name |Name |Card |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.1 | | members | String[Boolean] | Card |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.1.6) |
|name |String |Author, Nickname, |Section | +---------------------+-----------------------+--------------------+
| | |Organization, OrgUnit, |2.8.3, | | month | UnsignedInt | PartialDate |
| | |Title |Section | | | | (Section 2.8.1) |
| | | |2.2.1.3, | +---------------------+-----------------------+--------------------+
| | | |Section | | name | Name | Card |
| | | |2.2.2, | | | | (Section 2.2.1.1) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.4 | | name | String | Author |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.3), |
|nicknames |Id[Nickname] |Card |Section | | | | Nickname |
| | | |2.2.1.3 | | | | (Section 2.2.2), |
+-------------------+---------------------+-------------------------+------------+ | | | Organization |
|note |String |Note |Section | | | | (Section 2.2.3), |
| | | |2.8.3 | | | | OrgUnit |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.2.3), |
|notes |Id[Note] |Card |Section | | | | Title |
| | | |2.8.3 | | | | (Section 2.2.5) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|number |String |Phone |Section | | nicknames | Id[Nickname] | Card |
| | | |2.3.3 | | | | (Section 2.2.2) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|onlineServices |Id[OnlineService] |Card |Section | | note | String | Note |
| | | |2.3.2 | | | | (Section 2.8.3) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|organizationId |String |Title |Section | | notes | Id[Note] | Card |
| | | |2.2.4 | | | | (Section 2.8.3) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|organizations |Id[Organization] |Card |Section | | number | String | Phone |
| | | |2.2.2 | | | | (Section 2.3.3) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|personalInfo |Id[PersonalInfo] |Card |Section | | onlineServices | Id[OnlineService] | Card |
| | | |2.8.4 | | | | (Section 2.3.2) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|phones |Id[Phone] |Card |Section | | organizationId | String | Title |
| | | |2.3.3 | | | | (Section 2.2.5) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|phonetic |String |AddressComponent, |Section | | organizations | Id[Organization] | Card |
| | |NameComponent |2.5.1.2, | | | | (Section 2.2.3) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.1.2 | | personalInfo | Id[PersonalInfo] | Card |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.4) |
|phoneticScript |String |Address, Name |Section | +---------------------+-----------------------+--------------------+
| | | |2.2.1, | | phones | Id[Phone] | Card |
| | | |Section | | | | (Section 2.3.3) |
| | | |2.5.1 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | phonetic | String | AddressComponent |
|phoneticSystem |String |Address, Name |Section | | | | (Section 2.5.1.2), |
| | | |2.2.1, | | | | NameComponent |
| | | |Section | | | | (Section 2.2.1.2) |
| | | |2.5.1 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | phoneticScript | String | Address |
|place |Address |Anniversary |Section | | | | (Section 2.5.1.1), |
| | | |2.8.1 | | | | Name |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.2.1.1) |
|pref |UnsignedInt |Address, Calendar, |Section | +---------------------+-----------------------+--------------------+
| | |CryptoKey, Directory, |1.5.4, | | phoneticSystem | String | Address (2.5.1.1), |
| | |EmailAddress, |Section | | | | Name |
| | |LanguagePref, Link, |2.5.1, | | | | (Section 2.2.1.1) |
| | |Media, Nickname, |Section | +---------------------+-----------------------+--------------------+
| | |OnlineService, Phone, |2.4.1, | | place | Address | Anniversary |
| | |Pronouns, |Section | | | | (Section 2.8.1) |
| | |SchedulingAddress |2.6.1, | +---------------------+-----------------------+--------------------+
| | | |Section | | pref | UnsignedInt | Address |
| | | |2.6.2, | | | | (Section 2.5.1.1), |
| | | |Section | | | | Calendar |
| | | |2.3.1, | | | | (Section 2.4.1), |
| | | |Section | | | | CryptoKey |
| | | |2.3.4, | | | | (Section 2.6.1), |
| | | |Section | | | | Directory |
| | | |2.6.3, | | | | (Section 2.6.2), |
| | | |Section | | | | EmailAddress |
| | | |2.6.4, | | | | (Section 2.3.1), |
| | | |Section | | | | LanguagePref |
| | | |2.2.1.3, | | | | (Section 2.3.4), |
| | | |Section | | | | Link |
| | | |2.3.2, | | | | (Section 2.6.3), |
| | | |Section | | | | Media |
| | | |2.3.3, | | | | (Section 2.6.4), |
| | | |Section | | | | Nickname |
| | | |2.2.3, | | | | (Section 2.2.2), |
| | | |Section | | | | OnlineService |
| | | |2.4.2, | | | | (Section 2.3.2), |
| | | |Section | | | | Phone |
| | | |1.4.4 | | | | (Section 2.3.3), |
+-------------------+---------------------+-------------------------+------------+ | | | Pronouns |
|preferredLanguages |String[LanguagePref] |Card |Section | | | | (Section 2.2.4), |
| | | |2.3.4 | | | | SchedulingAddress |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.4.2). |
|prodId |String |Card |Section | | | | Also see Sections |
| | | |2.1.7 | | | | 1.4.4 and 1.5.3. |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|pronouns |Id[Pronouns] |SpeakToAs |Section | | preferredLanguages | String[LanguagePref] | Card |
| | | |2.2.3 | | | | (Section 2.3.4) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|relatedTo |String[Relation] |Card |Section | | prodId | String | Card |
| | | |2.1.8 | | | | (Section 2.1.7) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|relation |String[Boolean] |Relation |Section | | pronouns | Id[Pronouns] | SpeakToAs |
| | | |2.1.8 | | | | (Section 2.2.4) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|schedulingAddresses|Id[SchedulingAddress]|Card |Section | | relatedTo | String[Relation] | Card |
| | | |2.4.2 | | | | (Section 2.1.8) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|service |String |OnlineService |Section | | relation | String[Boolean] | Relation |
| | | |2.3.2 | | | | (Section 2.1.8) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|sortAs |String[String] |Name |Section | | schedulingAddresses | Id[SchedulingAddress] | Card |
| | | |2.2.1 | | | | (Section 2.4.2) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|sortAs |String |Organization, OrgUnit |Section | | service | String | OnlineService |
| | | |2.2.2 | | | | (Section 2.3.2) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|speakToAs |SpeakToAs |Card |Section | | sortAs | String[String] | Name |
| | | |2.2.3 | | | | (Section 2.2.1.1) |
+-------------------+---------------------+-------------------------+------------+ +---------------------+-----------------------+--------------------+
|timeZone |String |Address |Section | | sortAs | String | Organization |
| | | |2.5.1 | | | | (Section 2.2.3), |
+-------------------+---------------------+-------------------------+------------+ | | | OrgUnit |
|titles |Id[Title] |Card |Section | | | | (Section 2.2.3) |
| | | |2.2.4 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | speakToAs | SpeakToAs | Card |
|uid |String |Card |Section | | | | (Section 2.2.4) |
| | | |2.1.9 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | timeZone | String | Address |
|units |OrgUnit[] |Organization |Section | | | | (Section 2.5.1.1) |
| | | |2.2.2 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | titles | Id[Title] | Card |
|updated |UTCDateTime |Card |Section | | | | (Section 2.2.5) |
| | | |2.1.10 | +---------------------+-----------------------+--------------------+
+-------------------+---------------------+-------------------------+------------+ | uid | String | Card |
|uri |String |Author, Calendar, |Section | | | | (Section 2.1.9) |
| | |CryptoKey, Directory, |2.8.3, | +---------------------+-----------------------+--------------------+
| | |Link, Media, |Section | | units | OrgUnit[] | Organization |
| | |OnlineService, |1.4.4, | | | | (Section 2.2.3) |
| | |SchedulingAddress |Section | +---------------------+-----------------------+--------------------+
| | | |2.4.1, | | updated | UTCDateTime | Card |
| | | |Section | | | | (Section 2.1.10) |
| | | |2.6.1, | +---------------------+-----------------------+--------------------+
| | | |Section | | uri | String | Author |
| | | |2.6.2, | | | | (Section 2.8.3), |
| | | |Section | | | | Calendar |
| | | |2.6.3, | | | | (Section 2.4.1), |
| | | |Section | | | | CryptoKey |
| | | |2.6.4, | | | | (Section 2.6.1), |
| | | |Section | | | | Directory |
| | | |2.3.2, | | | | (Section 2.6.2), |
| | | |Section | | | | Link |
| | | |2.4.2 | | | | (Section 2.6.3), |
+-------------------+---------------------+-------------------------+------------+ | | | Media |
|user |String |OnlineService |Section | | | | (Section 2.6.4), |
| | | |2.3.2 | | | | OnlineService |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.3.2), |
|utc |UTCDateTime |Timestamp |Section | | | | SchedulingAddress |
| | | |2.8.1 | | | | (Section 2.4.2). |
+-------------------+---------------------+-------------------------+------------+ | | | Also see |
|value |String |AddressComponent, |Section | | | | Section 1.4.4. |
| | |NameComponent, |2.5.1, | +---------------------+-----------------------+--------------------+
| | |PersonalInfo |Section | | user | String | OnlineService |
| | | |2.2.1, | | | | (Section 2.3.2) |
| | | |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.4 | | utc | UTCDateTime | Timestamp |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.8.1) |
|year |UnsignedInt |PartialDate |Section | +---------------------+-----------------------+--------------------+
| | | |2.8.1 | | value | String | AddressComponent |
+-------------------+---------------------+-------------------------+------------+ | | | (Section 2.5.1.2), |
Table 2: JSContact Properties with "common" usage | | | NameComponent |
| | | (Section 2.2.1.2), |
| | | PersonalInfo |
| | | (Section 2.8.4) |
+---------------------+-----------------------+--------------------+
| version | String | Card |
| | | (Section 2.1.2) |
+---------------------+-----------------------+--------------------+
| year | UnsignedInt | PartialDate |
| | | (Section 2.8.1) |
+---------------------+-----------------------+--------------------+
The following table lists the initial reserved usage entries of the Table 2: JSContact Properties with "common" Usage
"JSContact Properties" registry. All RFC section references are for
[I-D.ietf-calext-jscontact]. The change controller for all these
properties is IETF.
+===============+============+============+==============+==========+ The following table lists the initial "reserved" usage entries of the
| Property | Property | Property | Reference or | Intended | "JSContact Properties" registry. For this property, the Change
| Name | Type | Context | Description | Usage | Controller is "IETF", and the RFC section reference is for RFC 9553.
+===============+============+============+==============+==========+
| extra | not | not | Section | reserved |
| | applicable | applicable | 1.5.2 | |
+---------------+------------+------------+--------------+----------+
Table 3: JSContact Properties with "reserved" usage +===============+============+============+=============+==========+
| Property Name | Property | Property | Reference/ | Intended |
| | Type | Context | Description | Usage |
+===============+============+============+=============+==========+
| extra | not | not | Section | reserved |
| | applicable | applicable | 1.7.3.1 | |
+---------------+------------+------------+-------------+----------+
3.6. Creation of the "JSContact Types" Registry Table 3: JSContact Properties with "reserved" Usage
IANA is asked to create the "JSContact Types" registry. The purpose 3.6. Creation of the JSContact Types Registry
of this new registry is to avoid name collisions for JSContact type
names and provide a complete reference for all data types used for
JSContact property values.
The registry entries sort alphabetically ascending by the "Type Name" IANA has created the "JSContact Types" registry. The purpose of this
column. Equal entries sort in any order. new registry is to avoid name collisions for JSContact type names and
provide a complete reference for all data types used for JSContact
property values.
The registry entries sort alphabetically in ascending order by the
"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 Type Name: The name of the type.
Reference or Description: a brief description or RFC number and Intended Usage: May be "common", "reserved", or "obsolete".
section reference where the Type is specified (may be omitted for
"reserved" type names)
Intended Usage: common, reserved, or obsolete Since Version: The JSContact version on which this type definition
is based. The version MUST be one of the allowed values of the
version property in the "JSContact Version" registry (see
Table 1).
Since Version: This defines the JSContact version on which this type Until Version: The JSContact version after which the type definition
definition is based on. The version MUST be one of the allowed was obsoleted; therefore, it MUST NOT be used in later versions.
values of the version property in the JSContact Enum Value The Until Version value either MUST NOT be set or MUST be one of
registry (see Table 1). the allowed values of the version property in the "JSContact
Version" registry (see Table 1).
Until Version: This defines the JSContact version after which this Change Controller: Person or entity responsible for requesting a
type definition got obsoleted and MUST NOT be used in later change to the entry's definition ("IETF" for RFCs from the IETF
versions. The Until Version value either MUST be not set, or one stream).
of the allowed values of the version property in the JSContact
Enum Value registry (see Table 1).
Change Controller: This is who may request a change to this entry's Reference or Description: A brief description or RFC number and
definition (IETF for RFCs from the IETF stream). section reference where the Type is specified. For reserved type
names, the reference or description MAY be omitted.
3.6.2. Initial Contents for the "JSContact Types" Registry 3.6.2. Initial Contents of the JSContact Types Registry
The following table lists the initial common usage entries of the The following table lists the initial "common" usage entries in the
JSContact Types registry. The Since Version for all types is 1.0. "JSContact Types" registry. For all of these types, the Since
The Until Version for all types is not set. All RFC section Version is "1.0", the Until Version is not set, the Change Controller
references are for [I-D.ietf-calext-jscontact]. The change is "IETF", and RFC section references are for RFC 9553.
controller for all these properties is IETF.
+===================+==========================+ +===================+==========================+
| Type Name | Reference or Description | | Type Name | Reference or Description |
+===================+==========================+ +===================+==========================+
| Address | Section 2.5.1 | | Address | Section 2.5.1.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| AddressComponent | Section 2.5.1 | | AddressComponent | Section 2.5.1.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Anniversary | Section 2.8.1 | | Anniversary | Section 2.8.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Author | Section 2.8.3 | | Author | Section 2.8.3 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Boolean | Section 1.3.2 | | Boolean | Section 1.3.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Calendar | Section 2.4.1 | | Calendar | Section 2.4.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Card | Section 2 | | Card | Section 2 |
skipping to change at page 71, line 5 skipping to change at line 3248
| Id | Section 1.4.1 | | Id | Section 1.4.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Int | Section 1.4.2 | | Int | Section 1.4.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| LanguagePref | Section 2.3.4 | | LanguagePref | Section 2.3.4 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Link | Section 2.6.3 | | Link | Section 2.6.3 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Media | Section 2.6.4 | | Media | Section 2.6.4 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Name | Section 2.2.1 | | Name | Section 2.2.1.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| NameComponent | Section 2.2.1 | | NameComponent | Section 2.2.1.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Nickname | Section 2.2.1.3 | | Nickname | Section 2.2.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Note | Section 2.8.3 | | Note | Section 2.8.3 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Number | Section 1.3.2 | | Number | Section 1.3.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| OnlineService | Section 2.3.2 | | OnlineService | Section 2.3.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Organization | Section 2.2.2 | | Organization | Section 2.2.3 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| OrgUnit | Section 2.2.2 | | OrgUnit | Section 2.2.3 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| PartialDate | Section 2.8.1 | | PartialDate | Section 2.8.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| PatchObject | Section 1.4.3 | | PatchObject | Section 1.4.3 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| PersonalInfo | Section 2.8.4 | | PersonalInfo | Section 2.8.4 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Phone | Section 2.3.3 | | Phone | Section 2.3.3 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Pronouns | Section 2.2.3 | | Pronouns | Section 2.2.4 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Relation | Section 2.1.8 | | Relation | Section 2.1.8 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| SchedulingAddress | Section 2.4.2 | | SchedulingAddress | Section 2.4.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| SpeakToAs | Section 2.2.3 | | SpeakToAs | Section 2.2.4 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| String | Section 1.3.2 | | String | Section 1.3.2 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Timestamp | Section 2.8.1 | | Timestamp | Section 2.8.1 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| Title | Section 2.2.4 | | Title | Section 2.2.5 |
+-------------------+--------------------------+ +-------------------+--------------------------+
| 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 Version" registry
registry (see Table 1). (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 Version" registry (see
Table 1).
Change Controller: This is who may request a change to this entry's Change Controller: Person or entity responsible for requesting a
definition (IETF for RFCs from the IETF stream). change to the entry's definition ("IETF" for RFCs from the IETF
stream).
Initial Contents: This is the initial list of defined values for Reference or Description: A brief description or RFC number and
this enum, using the template defined in Section 3.7.2. A section reference for the semantics of the value.
subregistry will be created with these values for this property
name/context tuple.
3.7.2. "JSContact Enum Values" Registry Value Template Note that the initial contents will be the initial list of defined
values for the enum, using the template defined in Section 3.7.2. A
subregistry will be created with these values for this property name/
context tuple.
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 Version" registry
registry (see Table 1). (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 Version" registry (see Table 1).
3.7.3. Initial Contents for the "JSContact Enum Values" Registry Change Controller: Person or entity responsible for requesting a
change to the entry's definition ("IETF" for RFCs from the IETF
stream).
For each subregistry created in this section, all RFC section Reference or Description: A brief description or RFC number and
references are for [I-D.ietf-calext-jscontact]. For all entries, the section reference for the semantics of the value.
Since Version is 1.0, the Until Version is not set, the Change
Controller is IETF. 3.7.3. Initial Contents of the JSContact Enum Values Registry
For all entries in each subregistry created in this section, the
Since Version is "1.0", the Until Version is not set, the Change
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.1 |
+------------+--------------------------+ +------------+--------------------------+
| delivery | Section 2.5.1 | | delivery | Section 2.5.1.1 |
+------------+--------------------------+ +------------+--------------------------+
| private | Section 1.5.1 | | private | Section 1.5.1 |
+------------+--------------------------+ +------------+--------------------------+
| work | Section 1.5.1 | | work | Section 1.5.1 |
+------------+--------------------------+ +------------+--------------------------+
Table 6: JSContact Enum Values for Table 6: JSContact Enum Values for
contexts (Context: Address) contexts (Context: Address)
Property Name: contexts Property Name: contexts
skipping to change at page 75, line 34 skipping to change at line 3462
Table 8: JSContact Enum Values for Table 8: JSContact Enum Values for
features (Context: Phone) features (Context: Phone)
Property Name: grammaticalGender Property Name: grammaticalGender
Context: SpeakToAs Context: SpeakToAs
Initial Contents: Initial Contents:
+============+==========================+ +============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
+============+==========================+ +============+==========================+
| animate | Section 2.2.3 | | animate | Section 2.2.4 |
+------------+--------------------------+ +------------+--------------------------+
| common | Section 2.2.3 | | common | Section 2.2.4 |
+------------+--------------------------+ +------------+--------------------------+
| feminine | Section 2.2.3 | | feminine | Section 2.2.4 |
+------------+--------------------------+ +------------+--------------------------+
| inanimate | Section 2.2.3 | | inanimate | Section 2.2.4 |
+------------+--------------------------+ +------------+--------------------------+
| masculine | Section 2.2.3 | | masculine | Section 2.2.4 |
+------------+--------------------------+ +------------+--------------------------+
| neuter | Section 2.2.3 | | neuter | Section 2.2.4 |
+------------+--------------------------+ +------------+--------------------------+
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.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| block | Section 2.5.1 | | block | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| building | Section 2.5.1 | | building | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| country | Section 2.5.1 | | country | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| direction | Section 2.5.1 | | direction | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| district | Section 2.5.1 | | district | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| floor | Section 2.5.1 | | floor | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| landmark | Section 2.5.1 | | landmark | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| locality | Section 2.5.1 | | locality | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| name | Section 2.5.1 | | name | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| number | Section 2.5.1 | | number | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| postcode | Section 2.5.1 | | postcode | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| postOfficeBox | Section 2.5.1 | | postOfficeBox | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| region | Section 2.5.1 | | region | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| room | Section 2.5.1 | | room | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| separator | Section 2.5.1 | | separator | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
| subdistrict | Section 2.5.1 | | subdistrict | Section 2.5.1.2 |
+---------------+--------------------------+ +---------------+--------------------------+
Table 10: JSContact Enum Values for kind Table 10: JSContact Enum Values for kind
(Context: AddressComponent) (Context: AddressComponent)
Property Name: kind Property Name: kind
Context: Anniversary Context: Anniversary
Initial Contents: Initial Contents:
+============+==========================+ +============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
+============+==========================+ +============+==========================+
| birth | Section 2.8.1 | | birth | Section 2.8.1 |
+------------+--------------------------+ +------------+--------------------------+
| death | Section 2.8.1 | | death | Section 2.8.1 |
+------------+--------------------------+ +------------+--------------------------+
| wedding | Section 2.8.1 | | wedding | Section 2.8.1 |
+------------+--------------------------+ +------------+--------------------------+
skipping to change at page 79, line 4 skipping to change at line 3620
+------------+--------------------------+ +------------+--------------------------+
| sound | Section 2.6.4 | | sound | Section 2.6.4 |
+------------+--------------------------+ +------------+--------------------------+
Table 16: JSContact Enum Values for Table 16: JSContact Enum Values for
kind (Context: Media) kind (Context: Media)
Property Name: kind Property Name: kind
Context: NameComponent Context: NameComponent
Initial Contents: Initial Contents:
+============+==========================+ +============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
+============+==========================+ +============+==========================+
| credential | Section 2.2.1 | | credential | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
| generation | Section 2.2.1 | | generation | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
| given | Section 2.2.1 | | given | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
| given2 | Section 2.2.1 | | given2 | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
| separator | Section 2.2.1 | | separator | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
| surname | Section 2.2.1 | | surname | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
| surname2 | Section 2.2.1 | | surname2 | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
| title | Section 2.2.1 | | title | Section 2.2.1.2 |
+------------+--------------------------+ +------------+--------------------------+
Table 17: JSContact Enum Values for Table 17: JSContact Enum Values for
kind (Context: NameComponent) kind (Context: NameComponent)
Property Name: kind Property Name: kind
Context: PersonalInfo Context: PersonalInfo
Initial Contents: Initial Contents:
+============+==========================+ +============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
skipping to change at page 80, line 4 skipping to change at line 3662
+------------+--------------------------+ +------------+--------------------------+
| interest | Section 2.8.4 | | interest | Section 2.8.4 |
+------------+--------------------------+ +------------+--------------------------+
Table 18: JSContact Enum Values for Table 18: JSContact Enum Values for
kind (Context: PersonalInfo) kind (Context: PersonalInfo)
Property Name: kind Property Name: kind
Context: Title Context: Title
Initial Contents: Initial Contents:
+============+==========================+ +============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
+============+==========================+ +============+==========================+
| role | Section 2.2.4 | | role | Section 2.2.5 |
+------------+--------------------------+ +------------+--------------------------+
| title | Section 2.2.4 | | title | Section 2.2.5 |
+------------+--------------------------+ +------------+--------------------------+
Table 19: JSContact Enum Values for Table 19: JSContact Enum Values for
kind (Context: Title) kind (Context: Title)
Property Name: level Property Name: level
Context: PersonalInfo Context: PersonalInfo
Initial Contents: Initial Contents:
+============+==========================+ +============+==========================+
| Enum Value | Reference or Description | | Enum Value | Reference or Description |
skipping to change at page 80, line 32 skipping to change at line 3689
| 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.4 |
+------------+--------------------------+
| jyut | Section 1.5.4 |
+------------+--------------------------+
| piny | Section 1.5.4 |
+------------+--------------------------+
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 3753
+--------------+--------------------------+ +--------------+--------------------------+
| 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 3829
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 3934
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 3992
[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 [RFC9554] Stepanek, R. and M. Loffredo, "vCard Format Extension for
Algorithm", <https://www.unicode.org/reports/tr9/>. JSContact", RFC 9554, DOI 10.17487/RFC9554, March 2024,
<https://www.rfc-editor.org/info/rfc9554>.
[W3C-URL] "W3C WG URL - Living Standard — Last Updated 21 August [RFC9555] Stepanek, R. and M. Loffredo, "vCard Format Extension for
2023", <https://url.spec.whatwg.org>. JSContact", RFC 9555, DOI 10.17487/RFC9555, March 2024,
<https://www.rfc-editor.org/info/rfc9555>.
[UBiDi] The Unicode Consortium, "Unicode Standard Annex #9:
Unicode Bidirectional Algorithm", Revision 48,
Unicode 15.1.0, August 2023,
<https://www.unicode.org/reports/tr9/>.
[UUID] Davis, K. R., Peabody, B. G., 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>.
[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. 604 change blocks. 
1923 lines changed or deleted 1935 lines changed or added

This html diff was produced by rfcdiff 1.48.