| RFC 10050 | JSContact Profiles | September 2026 |
| Stepanek & Loffredo | Standards Track | [Page] |
This document defines the "JSContact Profiles" registry, an IANA registry for named subsets of JSContact elements. The document aims to facilitate using JSContact in the context of contact data exchange protocols or other use cases in which supporting all JSContact semantics might be inappropriate.¶
This is an Internet Standards Track document.¶
This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 7841.¶
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/rfc10050.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The JSContact [RFC9553] contact card data model and format are designed for use in address book applications and directory services. Intended as an alternative to the prevalent vCard [RFC6350] data format, JSContact covers vCard core semantics and extensions, and it provides a rich model for personal names, postal addresses, and localization. All JSContact elements are relevant for some contact card use cases, and similar to vCard, implementations are expected to support these elements when exchanging contact card information using protocols such as CardDAV [RFC6352] and the JSON Meta Application Protocol (JMAP) for Contacts [RFC9610].¶
In contrast, other protocols and document specifications might require exchanging some contact card information, but not all of what JSContact provides. Section 1.7.4 of [RFC9553] outlines how JSContact implementations may ignore unknown JSContact elements, but this only applies to future extensions of [RFC9553]; they are still expected to implement all elements of the core specification. Also, the extensibility of JSContact and the requirement to preserve arbitrary contact elements might not be adequate for some protocols.¶
To make use of JSContact under these circumstances, this document defines a new IANA registry for JSContact that allows registration of named subsets of JSContact elements. These subsets are referred to as "JSContact profiles" and are meant to bring the following benefits:¶
This document is organized as follows. Section 3 defines JSContact profiles; Section 4 discusses the new "JSContact Profiles" registry created by IANA; and Appendix A illustrates JSContact profiles using an example.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
The ABNF definitions in this document use the notations of [RFC5234]. ABNF rules not defined in this document are defined in [RFC5234] (such as the ABNF for DIGIT).¶
A JSContact profile is a named and versioned set of JSContact elements, such as properties, types, and values. The JSContact elements MUST be registered in the IANA "JSContact" registry group [IANA.jscontact]. A profile MAY define additional restrictions for these elements as outlined in Section 3.3, but a profile MUST NOT loosen restrictions. This document creates an IANA registry for JSContact profiles (see Section 4).¶
A JSContact object complies with a profile if all its properties are in the set of properties defined by that profile and the property values comply with the profile restrictions for that property. A JSContact object MAY comply with multiple profiles. Accordingly, this document does not specify any means for JSContact data to communicate which profiles it complies with, e.g., it does not define a "profile" property for the Card object.¶
All properties and values of a JSContact object that complies with a profile MUST also be valid (Section 1.7 of [RFC9553]). Handling JSContact data that is valid but that does not comply with the expected profile is protocol-specific. This document deliberately does not define such non-compliant data as invalid. Profile designers decide on their own strategies for handling non-compliant data, one of which may be to reject it as invalid. JSContact data that complies with a profile may still not be valid in the context of that protocol; the protocol specification MAY define additional restrictions that a profile cannot express.¶
Section 3.1 defines how to name a JSContact profile; Section 3.2 defines how to version it; Section 3.3 defines how to specify the properties supported by that profile; and Section 3.4 describes how to determine the supported properties.¶
A JSContact profile has a unique name. The name MUST only contain ASCII lowercase alphabetic and numeric characters, optionally separated by hyphens. It MUST start with an alphabetic character, and it MUST be of at least 1 character and at most 255 characters in size. Formally, it MUST be a valid "profile-name" defined in Figure 1.¶
profile-name = lalpha *( ["-"] lalpha / DIGIT )
; at most 255 characters in size
lalpha = %x61-7A ; a-z
A JSContact profile has a current version, and each profile is versioned independently. The version MUST be a positive integer, and it MUST increase whenever the profile properties (see Section 3.3) change. The initial version value is 1.¶
A profile defines a list of property entries that together determine the set of properties supported by that profile, as described in Section 3.4. The list MUST NOT be empty.¶
Each property entry consists of the following elements:¶
This restricts the property value type in the listed Property Contexts. It allows a profile to restrict the allowed types to the original type definition such that future changes to JSContact do not extend the allowed types of the property for this profile, and it allows a profile to restrict the allowed types to a subset of the original type definition. The absence of any value indicates that this profile does not restrict the property value type of the original definition or any future extensions of the value type.¶
If set, the restricted value type MUST exactly match the original definition at the time when the profile is defined, or the original value type MUST contain some type signature in the form "A|B" and the restricted value type MUST resemble the original except that some of the original "A|B" forms now only allow a subset of the original choices. Restricted property types MUST NOT redefine the "defaultType" attribute (Section 1.3.3 of [RFC9553]); the rules about when to set the "@type" property (Section 1.3.4 of [RFC9553]) of the original type definition still apply.¶
As an example of restricting the type definition to prevent future type extensions in the profile, one might restrict the type definition of the "addresses" property of the Card object to "Id[Address]", which matches the original definition as of this writing.¶
As an example of restricting the type to a subset of the original value, one might want to restrict the "date" property of the Anniversary object to only allow partial dates as values. To do so, the original value type "PartialDate|Timestamp" can be restricted to "PartialDate". Note that the original value type need not be exactly in form "A|B". For example, the type signature "Id[A|B|C]" could be restricted to any of "Id[A|B]", "Id[A|C]", "Id[B|C]", "Id[A]", "Id[B]", "Id[C]", and the type signature "(A|B)[]" could be restricted to one of "A[]" or "B[]".¶
All profiles MUST support "@type" and "version"; therefore, profiles MUST NOT include entries for these properties.¶
The supported properties of a JSContact profile are determined by the profile's property entries and the contents of the IANA "JSContact Properties" registry, which are referred to here as "IANA-registered properties" for short. The "version" property of the Card object and the "@type" property of any object type are always supported.¶
A Card object complies with the profile if all its properties are part of the supported properties and all property values are valid according to the restrictions defined in the applicable property entries. A PatchObject MUST NOT patch properties that are not supported in that profile.¶
The following describes the steps to determine the supported properties:¶
Appendix A.4 describes how to determine the supported properties of the example profile in Appendix A.¶
IANA has created the "JSContact Profiles" registry within the "JSContact" registry group. The purpose of this new registry is to register profiles for JSContact data. The registry policy to add an entry to this registry is "Specification Required" [RFC8126]; this applies to defining a new profile name or version. The registry policy to update an existing profile is "Expert Review"; this applies to updating the references of an entry. The change controller is the IETF.¶
An entry in this registry consists of the following, all of which MUST be set:¶
Designated experts assert that all proposed assignments are valid according to the definitions in this document. For example, they check that:¶
On the other hand, designated experts do not decide the contents of the profile as long as the assignments are valid.¶
The decision whether to register a new profile name or register a new version for an existing profile depends on the scope of the proposed profile. A new profile name is recommended if the profile is introduced in the context of an application or protocol for which no JSContact profile is already registered or if the proposed profile properties or restrictions substantially differ from existing profiles for that context. A new version is recommended if the profile context does not change and multiple implementations of the current profile will also support the new version. The profile version of the new entry for an already-registered profile by that name has to be higher than the last registered version for that profile. Existing registry entries are preserved.¶
This document does not define any initial contents for the "JSContact Profiles" registry.¶
This document does not provide any new security considerations. The security considerations in Section 4 of [RFC9553] apply.¶
This section provides an example of a JSContact profile and illustrates how a JSContact Card complies with that profile.¶
The properties of the example profile are defined in Appendix A.1. The profile describes contact cards that can only contain:¶
An example of JSContact data that complies with this profile is shown in Appendix A.2. An example of its fictive IANA registration is shown in Appendix A.3. This profile is just for illustration; it is not registered with IANA. Appendix A.4 describes how to determine the supported properties for that profile.¶
The following entries define properties of that profile. Entry elements with empty values are omitted:¶
The following Card object complies with the example profile:¶
{
"@type": "Card",
"version": "1.0",
"name": {
"components": [
{ "kind": "given", "value": "Hayao" },
{ "kind": "surname", "value": "Miyazaki" }
]
},
"addresses": {
"a1": {
"full": "71 Cherry Court, Somewhere, 123SO, UK"
}
},
"emails": {
"e1": {
"address": "hayao@example.com"
}
},
"anniversaries": {
"a1": {
"kind": "birth",
"date": {
"month": 3,
"day": 4
}
}
},
"localizations": {
"jp": {
"name": {
"components": [
{ "kind": "surname", "value": "宮崎" },
{ "kind": "given", "value": "駿" }
]
}
}
}
}¶
Note that:¶
The following would be registered at IANA if this were a real profile:¶
The following illustrates how to determine the supported properties of the example profile in this appendix, according to the steps defined in Section 3.4:¶
We initialize the set of supported properties with all profile properties for which the Property Context includes the Card object. The set now includes the following properties:¶
For the Address object type, the profile has an entry for the "full" property, which contains the Address object in the Property Context, so we add that and only that to the set of supported properties. It now contains:¶
The value type of the Address.full property is not an object type, so we need not consider a new object type to inspect. The remaining object types to inspect are the Anniversary, EmailAddress, and Name objects.¶
For the Anniversary object type, the profile explicitly lists the "kind" and "date" properties, so we add them to the set of supported properties. It now contains:¶
The newly added Anniversary.date property has object value type PartialDate, so we add that to the list of object types to inspect. The entry restricts the type of that property to only be of that type, so we do not add the object value type Timestamp. The remaining object types to inspect are the EmailAddress, Name, and PartialDate objects.¶
For the PartialDate object type, the profile does not contain any entry where the Property Context contains the PartialDate object. Instead, we add properties from the "JSContact Properties" registry where the Property Context includes the PartialDate object. The set of supported properties now contains:¶
None of the newly added properties have object value types. The remaining object types to inspect are the EmailAddress and Name objects.¶
For the EmailAddress object type, the profile does not contain any entry where the Property Context contains the EmailAddress object. Instead, we add properties from the "JSContact Properties" registry where the Property Context includes the EmailAddress object. The set of supported properties now contains:¶
None of the newly added properties have object value types. The remaining object type to inspect is the Name object.¶
For the Name object type, the profile explicitly lists the "components" and "full" properties, so we add them to the set of supported properties. It now contains:¶
The newly added Name.components property has object value type NameComponent, so we add that to the list of object types to inspect.¶
For the NameComponent object type, the profile does not explicitly list any property. Instead, we add properties of the "JSContact Properties" registry where the Property Context includes the NameComponent object. The set of supported properties now contains:¶
None of the newly added properties have object value types, and there are no remaining object types to inspect. This determines the set of supported properties by that profile, in addition to the "Card.version" and "@type" property that are always supported.¶