<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-ietf-jmap-contacts-10" number="9610" submissionType="IETF" category="std" xml:lang="en" sortRefs="true" symRefs="true" tocInclude="true" consensus="true" updates="" obsoletes="" prepTime="2024-12-18T16:37:04" indexInclude="true" scripts="Common,Latin" tocDepth="3">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-jmap-contacts-10" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc9610" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="JMAP Contacts">JSON Meta Application Protocol (JMAP) for Contacts</title>
    <seriesInfo name="RFC" value="9610" stream="IETF"/>
    <author role="editor" initials="N." surname="Jenkins" fullname="Neil Jenkins">
      <organization showOnFrontPage="true">Fastmail</organization>
      <address>
        <postal>
          <street>PO Box 234, Collins St West</street>
          <city>Melbourne</city>
          <code>VIC 8007</code>
          <country>Australia</country>
        </postal>
        <email>neilj@fastmailteam.com</email>
        <uri>https://www.fastmail.com</uri>
      </address>
    </author>
    <date month="12" year="2024"/>
    <area>ART</area>
    <workgroup>jmap</workgroup>
    <keyword>JMAP</keyword>
    <keyword>JSON</keyword>
    <keyword>contacts</keyword>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">This document specifies a data model for synchronising contact data with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            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.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc9610" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2024 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) 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.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-notational-conventions">Notational Conventions</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.2">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.2.1"><xref derivedContent="1.2" format="counter" sectionFormat="of" target="section-1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-terminology">Terminology</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.3">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.3.1"><xref derivedContent="1.3" format="counter" sectionFormat="of" target="section-1.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-data-model-overview">Data Model Overview</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.4">
                <t indent="0" pn="section-toc.1-1.1.2.4.1"><xref derivedContent="1.4" format="counter" sectionFormat="of" target="section-1.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-addition-to-the-capabilitie">Addition to the Capabilities Object</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2.4.2">
                  <li pn="section-toc.1-1.1.2.4.2.1">
                    <t indent="0" pn="section-toc.1-1.1.2.4.2.1.1"><xref derivedContent="1.4.1" format="counter" sectionFormat="of" target="section-1.4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-urnietfparamsjmapcontacts">urn:ietf:params:jmap:contacts</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-addressbooks">AddressBooks</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.2.2">
              <li pn="section-toc.1-1.2.2.1">
                <t indent="0" pn="section-toc.1-1.2.2.1.1"><xref derivedContent="2.1" format="counter" sectionFormat="of" target="section-2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-addressbook-get">AddressBook/get</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.2">
                <t indent="0" pn="section-toc.1-1.2.2.2.1"><xref derivedContent="2.2" format="counter" sectionFormat="of" target="section-2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-addressbook-changes">AddressBook/changes</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.3">
                <t indent="0" pn="section-toc.1-1.2.2.3.1"><xref derivedContent="2.3" format="counter" sectionFormat="of" target="section-2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-addressbook-set">AddressBook/set</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contactcards">ContactCards</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t indent="0" pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contactcard-get">ContactCard/get</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contactcard-changes">ContactCard/changes</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.3">
                <t indent="0" pn="section-toc.1-1.3.2.3.1"><xref derivedContent="3.3" format="counter" sectionFormat="of" target="section-3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contactcard-query">ContactCard/query</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2.3.2">
                  <li pn="section-toc.1-1.3.2.3.2.1">
                    <t indent="0" pn="section-toc.1-1.3.2.3.2.1.1"><xref derivedContent="3.3.1" format="counter" sectionFormat="of" target="section-3.3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-filtering">Filtering</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.3.2.2">
                    <t indent="0" pn="section-toc.1-1.3.2.3.2.2.1"><xref derivedContent="3.3.2" format="counter" sectionFormat="of" target="section-3.3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sorting">Sorting</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.3.2.4">
                <t indent="0" pn="section-toc.1-1.3.2.4.1"><xref derivedContent="3.4" format="counter" sectionFormat="of" target="section-3.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contactcard-querychanges">ContactCard/queryChanges</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.5">
                <t indent="0" pn="section-toc.1-1.3.2.5.1"><xref derivedContent="3.5" format="counter" sectionFormat="of" target="section-3.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contactcard-set">ContactCard/set</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.6">
                <t indent="0" pn="section-toc.1-1.3.2.6.1"><xref derivedContent="3.6" format="counter" sectionFormat="of" target="section-3.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contactcard-copy">ContactCard/copy</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-examples">Examples</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-fetching-initial-data">Fetching Initial Data</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-changing-the-default-addres">Changing the Default Address Book</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-internationalisation-consid">Internationalisation Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent="7.1" format="counter" sectionFormat="of" target="section-7.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-jmap-capability-registratio">JMAP Capability Registration for "contacts"</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent="7.2" format="counter" sectionFormat="of" target="section-7.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-jmap-data-type-registration">JMAP Data Type Registration for "AddressBook"</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.3">
                <t indent="0" pn="section-toc.1-1.7.2.3.1"><xref derivedContent="7.3" format="counter" sectionFormat="of" target="section-7.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-jmap-data-type-registration-">JMAP Data Type Registration for "ContactCard"</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.4">
                <t indent="0" pn="section-toc.1-1.7.2.4.1"><xref derivedContent="7.4" format="counter" sectionFormat="of" target="section-7.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-jmap-error-codes-registry">JMAP Error Codes Registry</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2.4.2">
                  <li pn="section-toc.1-1.7.2.4.2.1">
                    <t indent="0" pn="section-toc.1-1.7.2.4.2.1.1"><xref derivedContent="7.4.1" format="counter" sectionFormat="of" target="section-7.4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-addressbookhascontents">addressBookHasContents</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.7.2.5">
                <t indent="0" pn="section-toc.1-1.7.2.5.1"><xref derivedContent="7.5" format="counter" sectionFormat="of" target="section-7.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-jscontact-property-registra">JSContact Property Registrations</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2.5.2">
                  <li pn="section-toc.1-1.7.2.5.2.1">
                    <t indent="0" pn="section-toc.1-1.7.2.5.2.1.1"><xref derivedContent="7.5.1" format="counter" sectionFormat="of" target="section-7.5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-id">id</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.5.2.2">
                    <t indent="0" pn="section-toc.1-1.7.2.5.2.2.1"><xref derivedContent="7.5.2" format="counter" sectionFormat="of" target="section-7.5.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-addressbookids">addressBookIds</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.5.2.3">
                    <t indent="0" pn="section-toc.1-1.7.2.5.2.3.1"><xref derivedContent="7.5.3" format="counter" sectionFormat="of" target="section-7.5.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-blobid">blobId</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.8.2">
              <li pn="section-toc.1-1.8.2.1">
                <t indent="0" pn="section-toc.1-1.8.2.1.1"><xref derivedContent="8.1" format="counter" sectionFormat="of" target="section-8.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.8.2.2">
                <t indent="0" pn="section-toc.1-1.8.2.2.1"><xref derivedContent="8.2" format="counter" sectionFormat="of" target="section-8.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.a"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-address">Author's Address</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" removeInRFC="false" toc="include" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">The JSON Meta Application Protocol (JMAP) <xref target="RFC8620" format="default" sectionFormat="of" derivedContent="RFC8620"/> is a generic protocol for synchronising data, such as mail, calendars, or contacts, between a client and a server. It is optimised for mobile and web environments and aims to provide a consistent interface to different data types.</t>
      <t indent="0" pn="section-1-2">This specification defines a data model for synchronising contacts between a client and a server using JMAP.</t>
      <section anchor="notational-conventions" numbered="true" removeInRFC="false" toc="include" pn="section-1.1">
        <name slugifiedName="name-notational-conventions">Notational Conventions</name>
        <t indent="0" pn="section-1.1-1">
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
    described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> 
    when, and only when, they appear in all capitals, as shown here.
        </t>
        <t indent="0" pn="section-1.1-2">Type signatures, examples, and property descriptions in this document follow the conventions established in <xref target="RFC8620" section="1.1" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-1.1" derivedContent="RFC8620"/>.  The Id, UnsignedInt, and UTCDate data types defined in Sections <xref target="RFC8620" section="1.2" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-1.2" derivedContent="RFC8620"/>, <xref target="RFC8620" section="1.3" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-1.3" derivedContent="RFC8620"/>, and <xref target="RFC8620" section="1.4" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-1.4" derivedContent="RFC8620"/> of <xref target="RFC8620" format="default" sectionFormat="of" derivedContent="RFC8620"/> are also used in this document.</t>
      </section>
      <section anchor="terminology" numbered="true" removeInRFC="false" toc="include" pn="section-1.2">
        <name slugifiedName="name-terminology">Terminology</name>
        <t indent="0" pn="section-1.2-1">The same terminology used in the core JMAP specification (see <xref target="RFC8620" section="1.6" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-1.6" derivedContent="RFC8620"/>) is also used in this document.</t>
        <t indent="0" pn="section-1.2-2">The terms AddressBook and ContactCard (with these specific capitalizations) are used to refer to the data types defined in this document and instances of those data types.</t>
      </section>
      <section anchor="data-model-overview" numbered="true" removeInRFC="false" toc="include" pn="section-1.3">
        <name slugifiedName="name-data-model-overview">Data Model Overview</name>
        <t indent="0" pn="section-1.3-1">An Account (see <xref target="RFC8620" section="1.6.2" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-1.6.2" derivedContent="RFC8620"/>) with support for the contact data model contains zero or more AddressBook objects, which is a named collection of zero or more ContactCards. A ContactCard is a representation of a person, company, entity, or a group of such entities in JSContact Card format, as defined in <xref target="RFC9553" section="2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2" derivedContent="RFC9553"/>. Each ContactCard belongs to one or more AddressBooks.</t>
        <t indent="0" pn="section-1.3-2">In servers with support for JMAP Sharing <xref target="RFC9670" format="default" sectionFormat="of" derivedContent="RFC9670"/>, users may see and configure sharing of contact data with others. Sharing permissions are managed per AddressBook.</t>
      </section>
      <section anchor="addition-to-the-capabilities-object" numbered="true" removeInRFC="false" toc="include" pn="section-1.4">
        <name slugifiedName="name-addition-to-the-capabilitie">Addition to the Capabilities Object</name>
        <t indent="0" pn="section-1.4-1">The capabilities object is returned as part of the JMAP Session object; see <xref target="RFC8620" section="2" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-2" derivedContent="RFC8620"/>. This document defines one additional capability URI.</t>
        <section anchor="urn-ietf-params-jmap-contacts" numbered="true" removeInRFC="false" toc="include" pn="section-1.4.1">
          <name slugifiedName="name-urnietfparamsjmapcontacts">urn:ietf:params:jmap:contacts</name>
          <t indent="0" pn="section-1.4.1-1">This represents support for the AddressBook and ContactCard data types and associated API methods. The value of this property in the JMAP Session "capabilities" property is an empty object.</t>
          <t indent="0" pn="section-1.4.1-2">The value of this property in an account's "accountCapabilities" property is an object that <bcp14>MUST</bcp14> contain the following information on server capabilities and permissions for that account:</t>
          <dl spacing="normal" newline="true" indent="3" pn="section-1.4.1-3">
            <dt pn="section-1.4.1-3.1"><strong>maxAddressBooksPerCard</strong>: <tt>UnsignedInt|null</tt></dt>
            <dd pn="section-1.4.1-3.2">The maximum number of AddressBooks (see <xref target="addressbooks" format="default" sectionFormat="of" derivedContent="Section 2"/>) that can be assigned to a single ContactCard object (see <xref target="contactcards" format="default" sectionFormat="of" derivedContent="Section 3"/>). This <bcp14>MUST</bcp14> be an integer &gt;= 1, or null for no limit (or rather, the limit is always the number of AddressBooks in the account).</dd>
            <dt pn="section-1.4.1-3.3"><strong>mayCreateAddressBook</strong>: <tt>Boolean</tt></dt>
            <dd pn="section-1.4.1-3.4">The user may create an AddressBook in this account if, and only if, this is true.</dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="addressbooks" numbered="true" removeInRFC="false" toc="include" pn="section-2">
      <name slugifiedName="name-addressbooks">AddressBooks</name>
      <t indent="0" pn="section-2-1">An AddressBook is a named collection of ContactCards. All ContactCards are associated with one or more AddressBooks.</t>
      <t indent="0" pn="section-2-2">An <strong>AddressBook</strong> object has the following properties:</t>
      <dl spacing="normal" newline="true" indent="3" pn="section-2-3">
        <dt pn="section-2-3.1"><strong>id</strong>: <tt>Id</tt> (immutable; server-set)</dt>
        <dd pn="section-2-3.2">The id of the AddressBook.</dd>
        <dt pn="section-2-3.3"><strong>name</strong>: <tt>String</tt></dt>
        <dd pn="section-2-3.4">The user-visible name of the AddressBook. This <bcp14>MUST NOT</bcp14> be the empty string and <bcp14>MUST NOT</bcp14> be greater than 255 octets in size when encoded as UTF-8.</dd>
        <dt pn="section-2-3.5"><strong>description</strong>: <tt>String|null</tt> (default: null)</dt>
        <dd pn="section-2-3.6">An optional long-form description of the AddressBook that provides context in shared environments where users need more than just the name.</dd>
        <dt pn="section-2-3.7"><strong>sortOrder</strong>: <tt>UnsignedInt</tt> (default: 0)</dt>
        <dd pn="section-2-3.8">
          <t indent="0" pn="section-2-3.8.1">Defines the sort order of AddressBooks when presented in the client's UI so it is consistent between devices. The number <bcp14>MUST</bcp14> be an integer in the range 0 &lt;= sortOrder &lt; 2<sup>31</sup>.</t>
          <t indent="0" pn="section-2-3.8.2">An AddressBook with a lower order is to be displayed before a AddressBook with a higher order in any list of AddressBooks in the client's UI. AddressBooks with equal order should be sorted in alphabetical order by name.  The sorting should take into account locale-specific character order convention.</t>
        </dd>
        <dt pn="section-2-3.9"><strong>isDefault</strong>: <tt>Boolean</tt> (server-set)</dt>
        <dd pn="section-2-3.10">This <bcp14>SHOULD</bcp14> be true for exactly one AddressBook in any account and <bcp14>MUST NOT</bcp14>
be true for more than one AddressBook within an account. The default
AddressBook should be used by clients whenever they need to choose an
AddressBook for the user within this account and they do not have any other
information on which to make a choice. For example, if the user creates a new
contact card, the client may automatically set the card as belonging to the
default AddressBook from the user's primary account.</dd>
        <dt pn="section-2-3.11"><strong>isSubscribed</strong>: <tt>Boolean</tt></dt>
        <dd pn="section-2-3.12">
          <t indent="0" pn="section-2-3.12.1">True if the user has indicated they wish to see this AddressBook in their client. This <bcp14>SHOULD</bcp14> default to false for AddressBooks in shared accounts that the user has access to and true for any new AddressBooks created by the user themself.</t>
          <t indent="0" pn="section-2-3.12.2">If false, the AddressBook and its contents <bcp14>SHOULD</bcp14> only be
displayed when the user explicitly requests it. The UI may offer to the user the option of subscribing to it.</t>
        </dd>
        <dt pn="section-2-3.13"><strong>shareWith</strong>: <tt>Id[AddressBookRights]|null</tt> (default: null)</dt>
        <dd pn="section-2-3.14">A map of the Principal id (<xref target="RFC9670" section="2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9670#section-2" derivedContent="RFC9670"/>) to rights for Principals this AddressBook is shared with. The Principal to which this AddressBook belongs <bcp14>MUST NOT</bcp14> be in this set. This is null if the AddressBook is not shared with anyone or if the server does not support <xref target="RFC9670" format="default" sectionFormat="of" derivedContent="RFC9670"/>. The value may be modified only if the user has the "mayShare" right. The account id for the Principals may be found in the <tt>urn:ietf:params:jmap:principals:owner</tt> capability of the Account to which the AddressBook belongs.</dd>
        <dt pn="section-2-3.15"><strong>myRights</strong>: <tt>AddressBookRights</tt> (server-set)</dt>
        <dd pn="section-2-3.16">The set of access rights the user has in relation to this AddressBook.</dd>
      </dl>
      <t indent="0" pn="section-2-4">An <strong>AddressBookRights</strong> object has the following properties:</t>
      <dl spacing="normal" newline="true" indent="3" pn="section-2-5">
        <dt pn="section-2-5.1"><strong>mayRead</strong>: <tt>Boolean</tt></dt>
        <dd pn="section-2-5.2">The user may fetch the ContactCards in this AddressBook.</dd>
        <dt pn="section-2-5.3"><strong>mayWrite</strong>: <tt>Boolean</tt></dt>
        <dd pn="section-2-5.4">The user may create, modify, or destroy all ContactCards in this AddressBook, or move them to or from this AddressBook.</dd>
        <dt pn="section-2-5.5"><strong>mayShare</strong>: <tt>Boolean</tt></dt>
        <dd pn="section-2-5.6">The user may modify the "shareWith" property for this AddressBook.</dd>
        <dt pn="section-2-5.7"><strong>mayDelete</strong>: <tt>Boolean</tt></dt>
        <dd pn="section-2-5.8">The user may delete the AddressBook itself.</dd>
      </dl>
      <section anchor="addressbook-get" numbered="true" removeInRFC="false" toc="include" pn="section-2.1">
        <name slugifiedName="name-addressbook-get">AddressBook/get</name>
        <t indent="0" pn="section-2.1-1">This is a standard "/get" method as described in <xref target="RFC8620" section="5.1" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.1" derivedContent="RFC8620"/>. The "ids" argument may be null to fetch all at once.</t>
      </section>
      <section anchor="addressbook-changes" numbered="true" removeInRFC="false" toc="include" pn="section-2.2">
        <name slugifiedName="name-addressbook-changes">AddressBook/changes</name>
        <t indent="0" pn="section-2.2-1">This is a standard "/changes" method as described in <xref target="RFC8620" section="5.2" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.2" derivedContent="RFC8620"/>.</t>
      </section>
      <section anchor="addressbook-set" numbered="true" removeInRFC="false" toc="include" pn="section-2.3">
        <name slugifiedName="name-addressbook-set">AddressBook/set</name>
        <t indent="0" pn="section-2.3-1">This is a standard "/set" method as described in <xref target="RFC8620" section="5.3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.3" derivedContent="RFC8620"/>, but with the following additional request arguments:</t>
        <dl spacing="normal" newline="true" indent="3" pn="section-2.3-2">
          <dt pn="section-2.3-2.1"><strong>onDestroyRemoveContents</strong>: <tt>Boolean</tt> (default: false)</dt>
          <dd pn="section-2.3-2.2">If false, any attempt to destroy an AddressBook that still has a ContactCard
in it will be rejected with an "addressBookHasContents" SetError. If
true, any ContactCard that is in the AddressBook will be removed from it, and if such a ContactCard does not belong to any other AddressBook, it will be destroyed.</dd>
          <dt pn="section-2.3-2.3"><strong>onSuccessSetIsDefault</strong>: <tt>Id|null</tt></dt>
          <dd pn="section-2.3-2.4">If an id is given, and all creates, updates, and destroys (if any) succeed
without error, the server will try to set this AddressBook as the default.
(For references to AddressBook creations, this is equivalent to a
creation-reference, so the id will be the creation id prefixed with a "#".)</dd>
        </dl>
        <t indent="0" pn="section-2.3-3">If the id is not found or if the change is not permitted by the server for
policy reasons, it <bcp14>MUST</bcp14> be ignored and the current default
AddressBook (if any) will remain as such. No error is returned to the client
in this case.</t>
        <t indent="0" pn="section-2.3-4">As per <xref target="RFC8620" section="5.3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.3" derivedContent="RFC8620"/>, if the default AddressBook is successfully changed, any changed objects <bcp14>MUST</bcp14> be reported in either the "created" or "updated" argument in the response as appropriate, with the server-set value included.</t>
        <t indent="0" pn="section-2.3-5">The "shareWith" property may only be set by users that have the "mayShare" right. When modifying the "shareWith" property, the user cannot give a right to a Principal if the Principal did not already have that right and the user making the change also does not have that right. Any attempt to do so <bcp14>MUST</bcp14> be rejected with a "forbidden" SetError.</t>
        <t indent="0" pn="section-2.3-6">Users can subscribe or unsubscribe to an AddressBook by setting the "isSubscribed" property. The server <bcp14>MAY</bcp14> forbid users from subscribing to certain AddressBooks even though they have permission to see them, rejecting the update with a "forbidden" SetError.</t>
        <t indent="0" pn="section-2.3-7">The following extra SetError type is defined for "destroy":</t>
        <dl spacing="normal" indent="3" newline="false" pn="section-2.3-8">
          <dt pn="section-2.3-8.1"><strong>addressBookHasContents</strong>:</dt>
          <dd pn="section-2.3-8.2">The AddressBook has at least one ContactCard assigned to it and the "onDestroyRemoveContents" argument was false.</dd>
        </dl>
      </section>
    </section>
    <section anchor="contactcards" numbered="true" removeInRFC="false" toc="include" pn="section-3">
      <name slugifiedName="name-contactcards">ContactCards</name>
      <t indent="0" pn="section-3-1">A <strong>ContactCard</strong> object contains information about a person, company, or other entity, or represents a group of such entities. It is a JSContact Card object as defined in <xref target="RFC9553" section="2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2" derivedContent="RFC9553"/> with the following additional properties:</t>
      <dl spacing="normal" newline="true" indent="3" pn="section-3-2">
        <dt pn="section-3-2.1"><strong>id</strong>: <tt>Id</tt> (immutable; server-set)</dt>
        <dd pn="section-3-2.2">The id of the ContactCard. The "id" property <bcp14>MAY</bcp14> be different to the ContactCard's "uid" property (as defined in <xref target="RFC9553" section="2.1.9" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.9" derivedContent="RFC9553"/>). However, there <bcp14>MUST NOT</bcp14> be more than one ContactCard with the same uid in an Account.</dd>
        <dt pn="section-3-2.3"><strong>addressBookIds</strong>: <tt>Id[Boolean]</tt></dt>
        <dd pn="section-3-2.4">The set of AddressBook ids that this ContactCard belongs to. A card <bcp14>MUST</bcp14> belong to at least one AddressBook at all times (until it is destroyed). The set is represented as an object, with each key being an AddressBook id. The value for each key in the object <bcp14>MUST</bcp14> be true.</dd>
      </dl>
      <t indent="0" pn="section-3-3">For any Media object in the card (see <xref target="RFC9553" section="2.6.4" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.6.4" derivedContent="RFC9553"/>), a new property is defined:</t>
      <dl spacing="normal" newline="true" indent="3" pn="section-3-4">
        <dt pn="section-3-4.1"><strong>blobId</strong>: <tt>Id</tt></dt>
        <dd pn="section-3-4.2">An id for the Blob representing the binary contents of the resource.</dd>
      </dl>
      <t indent="0" pn="section-3-5">When returning ContactCards, any Media with a URI that uses the "data:" URL scheme <xref target="RFC2397" format="default" sectionFormat="of" derivedContent="RFC2397"/> <bcp14>SHOULD</bcp14> return a "blobId" property and omit the "uri" property, as this lets clients load the (potentially large) image file only when needed and avoids the overhead of Base64 encoding. The "mediaType" property <bcp14>MUST</bcp14> also be set. Similarly, when creating or updating a ContactCard, clients <bcp14>MAY</bcp14> send a "blobId" instead of the "uri" property for a Media object.</t>
      <t indent="0" pn="section-3-6">A contact card with a "kind" property equal to "group" represents a group of contacts. Clients often present these separately from other contact cards. The "members" property, as defined in <xref target="RFC9553" section="2.1.6" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.6" derivedContent="RFC9553"/>, contains a set of uids (as defined in <xref target="RFC9553" section="2.1.9" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.9" derivedContent="RFC9553"/>) for other contacts that are the members of this group.
Clients should consider the group to contain any ContactCard with a matching uid from any account they have access to that has support for the <tt>urn:ietf:params:jmap:contacts</tt> capability. Any uid that cannot be found <bcp14>SHOULD</bcp14> be ignored but preserved. For example, suppose a user adds contacts from a shared address book to their private group, then temporarily loses access to this address book. The uids cannot be resolved, so the contacts will disappear from the group. However, if they are given permission to access the data again, the uids will be found and the contacts will reappear.</t>
      <section anchor="contactcard-get" numbered="true" removeInRFC="false" toc="include" pn="section-3.1">
        <name slugifiedName="name-contactcard-get">ContactCard/get</name>
        <t indent="0" pn="section-3.1-1">This is a standard "/get" method as described in <xref target="RFC8620" section="5.1" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.1" derivedContent="RFC8620"/>.</t>
      </section>
      <section anchor="contactcard-changes" numbered="true" removeInRFC="false" toc="include" pn="section-3.2">
        <name slugifiedName="name-contactcard-changes">ContactCard/changes</name>
        <t indent="0" pn="section-3.2-1">This is a standard "/changes" method as described in <xref target="RFC8620" section="5.2" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.2" derivedContent="RFC8620"/>.</t>
      </section>
      <section anchor="contactcard-query" numbered="true" removeInRFC="false" toc="include" pn="section-3.3">
        <name slugifiedName="name-contactcard-query">ContactCard/query</name>
        <t indent="0" pn="section-3.3-1">This is a standard "/query" method as described in <xref target="RFC8620" section="5.5" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.5" derivedContent="RFC8620"/>.</t>
        <section anchor="filtering" numbered="true" removeInRFC="false" toc="include" pn="section-3.3.1">
          <name slugifiedName="name-filtering">Filtering</name>
          <t indent="0" pn="section-3.3.1-1">A <strong>FilterCondition</strong> object has the following properties, any of which may be omitted:</t>
          <dl spacing="normal" newline="true" indent="3" pn="section-3.3.1-2">
            <dt pn="section-3.3.1-2.1"><strong>inAddressBook</strong>: <tt>Id</tt></dt>
            <dd pn="section-3.3.1-2.2">An AddressBook id. A card must be in this address book to match the condition.</dd>
            <dt pn="section-3.3.1-2.3"><strong>uid</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.4">A card must have this string exactly as its uid (as defined in <xref target="RFC9553" section="2.1.9" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.9" derivedContent="RFC9553"/>) to match.</dd>
            <dt pn="section-3.3.1-2.5"><strong>hasMember</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.6">A card must have a "members" property (as defined in <xref target="RFC9553" section="2.1.6" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.6" derivedContent="RFC9553"/>) that contains this string as one of the uids in the set to match.</dd>
            <dt pn="section-3.3.1-2.7"><strong>kind</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.8">A card must have a "kind" property (as defined in <xref target="RFC9553" section="2.1.4" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.4" derivedContent="RFC9553"/>) that equals this string exactly to match.</dd>
            <dt pn="section-3.3.1-2.9"><strong>createdBefore</strong>: <tt>UTCDate</tt></dt>
            <dd pn="section-3.3.1-2.10">The "created" date-time of the ContactCard (as defined in <xref target="RFC9553" section="2.1.3" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.3" derivedContent="RFC9553"/>) must be before this date-time to match the condition.</dd>
            <dt pn="section-3.3.1-2.11"><strong>createdAfter</strong>: <tt>UTCDate</tt></dt>
            <dd pn="section-3.3.1-2.12">The "created" date-time of the ContactCard (as defined in <xref target="RFC9553" section="2.1.3" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.3" derivedContent="RFC9553"/>) must be the same or after this date-time to match the condition.</dd>
            <dt pn="section-3.3.1-2.13"><strong>updatedBefore</strong>: <tt>UTCDate</tt></dt>
            <dd pn="section-3.3.1-2.14">The "updated" date-time of the ContactCard (as defined in <xref target="RFC9553" section="2.1.10" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.10" derivedContent="RFC9553"/>) must be before this date-time to match the condition.</dd>
            <dt pn="section-3.3.1-2.15"><strong>updatedAfter</strong>: <tt>UTCDate</tt></dt>
            <dd pn="section-3.3.1-2.16">The "updated" date-time of the ContactCard (as defined in <xref target="RFC9553" section="2.1.10" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.1.10" derivedContent="RFC9553"/>) must be the same or after this date-time to match the condition.</dd>
            <dt pn="section-3.3.1-2.17"><strong>text</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.18">A card matches this condition if the text matches with text in the card.</dd>
            <dt pn="section-3.3.1-2.19"><strong>name</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.20">A card matches this condition if the value of any NameComponent in the "name" property or the "full" property in the "name" property of the card (as defined in <xref target="RFC9553" section="2.2.1.2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.2.1.2" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.21"><strong>name/given</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.22">A card matches this condition if the value of a NameComponent with kind "given" inside the "name" property of the card (as defined in <xref target="RFC9553" section="2.2.1.2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.2.1.2" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.23"><strong>name/surname</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.24">A card matches this condition if the value of a NameComponent with kind "surname" inside the "name" property of the card (as defined in <xref target="RFC9553" section="2.2.1.2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.2.1.2" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.25"><strong>name/surname2</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.26">A card matches this condition if the value of a NameComponent with kind "surname2" inside the "name" property of the card (as defined in <xref target="RFC9553" section="2.2.1.2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.2.1.2" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.27"><strong>nickname</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.28">A card matches this condition if the "name" of any Nickname in the "nicknames" property of the card (as defined in <xref target="RFC9553" section="2.2.2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.2.2" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.29"><strong>organization</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.30">A card matches this condition if the "name" of any Organization in the "organizations" property of the card (as defined in <xref target="RFC9553" section="2.2.3" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.2.3" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.31"><strong>email</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.32">A card matches this condition if the "address" or "label" of any EmailAddress in the "emails" property of the card (as defined in <xref target="RFC9553" section="2.3.1" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.3.1" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.33"><strong>phone</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.34">A card matches this condition if the "number" or "label" of any Phone in the "phones" property of the card (as defined in <xref target="RFC9553" section="2.3.3" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.3.3" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.35"><strong>onlineService</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.36">A card matches this condition if the "service", "uri", "user", or "label" of any OnlineService in the "onlineServices" property of the card (as defined in <xref target="RFC9553" section="2.3.2" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.3.2" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.37"><strong>address</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.38">A card matches this condition if the value of any AddressComponent in the "addresses" property or the "full" property in the "addresses" property of the card (as defined in <xref target="RFC9553" section="2.5.1" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.5.1" derivedContent="RFC9553"/>) matches the value.</dd>
            <dt pn="section-3.3.1-2.39"><strong>note</strong>: <tt>String</tt></dt>
            <dd pn="section-3.3.1-2.40">A card matches this condition if the "note" of any Note in the "notes" property of the card (as defined in <xref target="RFC9553" section="2.8.3" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-2.8.3" derivedContent="RFC9553"/>) matches the value.</dd>
          </dl>
          <t indent="0" pn="section-3.3.1-3">If zero properties are specified on the FilterCondition, the condition <bcp14>MUST</bcp14> always evaluate to true. If multiple properties are specified, ALL must apply for the condition to be true (it is equivalent to splitting the object into one-property conditions and making them all the child of an AND filter operator).</t>
          <t indent="0" pn="section-3.3.1-4">The exact semantics for matching <tt>String</tt> fields is deliberately not defined to allow for flexibility in indexing implementation, subject to the following:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.3.1-5">
            <li pn="section-3.3.1-5.1">Text <bcp14>SHOULD</bcp14> be matched in a case-insensitive manner.</li>
            <li pn="section-3.3.1-5.2">Text contained in either (but matched) single or double quotes <bcp14>SHOULD</bcp14> be treated as a phrase search. That is, a match is required for that exact sequence of words, excluding the surrounding quotation marks. Use <tt>\"</tt>, <tt>\'</tt>, and <tt>\\</tt> to match a literal <tt>"</tt>, <tt>'</tt>, and <tt>\</tt> respectively in a phrase.</li>
            <li pn="section-3.3.1-5.3">Outside of a phrase, whitespace <bcp14>SHOULD</bcp14> be treated as dividing separate tokens that may be searched for separately in the contact, but <bcp14>MUST</bcp14> all be present for the contact to match the filter.</li>
            <li pn="section-3.3.1-5.4">Tokens <bcp14>MAY</bcp14> be matched on a whole-word basis using stemming (e.g., a text search for <tt>bus</tt> would match "buses", but not "business").</li>
          </ul>
        </section>
        <section anchor="sorting" numbered="true" removeInRFC="false" toc="include" pn="section-3.3.2">
          <name slugifiedName="name-sorting">Sorting</name>
          <t indent="0" pn="section-3.3.2-1">The following values for the "property" field on the Comparator object
<bcp14>MUST</bcp14> be supported for sorting:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.3.2-2">
            <li pn="section-3.3.2-2.1">"created" - The "created" date on the ContactCard.</li>
            <li pn="section-3.3.2-2.2">"updated" - The "updated" date on the ContactCard.</li>
          </ul>
          <t indent="0" pn="section-3.3.2-3">The following values for the "property" field on the Comparator object <bcp14>SHOULD</bcp14> be supported for sorting:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.3.2-4">
            <li pn="section-3.3.2-4.1">"name/given" - The value of the first NameComponent in the "name" property
whose "kind" is "given".</li>
            <li pn="section-3.3.2-4.2">"name/surname" - The value of the first NameComponent in the "name" property
whose "kind" is "surname".</li>
            <li pn="section-3.3.2-4.3">"name/surname2" - The value of the first NameComponent in the "name"
property whose "kind" is "surname2".</li>
          </ul>
        </section>
      </section>
      <section anchor="contactcard-querychanges" numbered="true" removeInRFC="false" toc="include" pn="section-3.4">
        <name slugifiedName="name-contactcard-querychanges">ContactCard/queryChanges</name>
        <t indent="0" pn="section-3.4-1">This is a standard "/queryChanges" method as described in <xref target="RFC8620" section="5.6" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.6" derivedContent="RFC8620"/>.</t>
      </section>
      <section anchor="contactcard-set" numbered="true" removeInRFC="false" toc="include" pn="section-3.5">
        <name slugifiedName="name-contactcard-set">ContactCard/set</name>
        <t indent="0" pn="section-3.5-1">This is a standard "/set" method as described in <xref target="RFC8620" section="5.3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.3" derivedContent="RFC8620"/>.</t>
        <t indent="0" pn="section-3.5-2">To set a new photo, the file must first be uploaded using the upload mechanism as described in <xref target="RFC8620" section="6.1" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-6.1" derivedContent="RFC8620"/>. This will give the client a valid blobId, size, and type to use. The server <bcp14>MUST</bcp14> reject attempts to set a file that is not a recognised image type as the photo for a card.</t>
      </section>
      <section anchor="contactcard-copy" numbered="true" removeInRFC="false" toc="include" pn="section-3.6">
        <name slugifiedName="name-contactcard-copy">ContactCard/copy</name>
        <t indent="0" pn="section-3.6-1">This is a standard "/copy" method as described in <xref target="RFC8620" section="5.4" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.4" derivedContent="RFC8620"/>.</t>
      </section>
    </section>
    <section anchor="examples" numbered="true" removeInRFC="false" toc="include" pn="section-4">
      <name slugifiedName="name-examples">Examples</name>
      <t indent="0" pn="section-4-1">For brevity, only the "methodCalls" property of the Request object and the "methodResponses" property of the Response object is shown in the following examples.</t>
      <section anchor="fetching-initial-data" numbered="true" removeInRFC="false" toc="include" pn="section-4.1">
        <name slugifiedName="name-fetching-initial-data">Fetching Initial Data</name>
        <t indent="0" pn="section-4.1-1">A user has authenticated and the client has fetched the JMAP Session object. It finds a single Account with the "urn:ietf:params:jmap:contacts" capability with id "a0x9" and wants to fetch all the address books and contacts. It might make the following request:</t>
        <figure align="left" suppress-title="false" pn="figure-1">
          <name slugifiedName="name-methodcalls-property-of-a-j">"methodCalls" Property of a JMAP Request</name>
          <sourcecode type="json" markers="false" pn="section-4.1-2.1">[
  ["AddressBook/get", {
    "accountId": "a0x9"
  }, "0"],
  ["ContactCard/get", {
    "accountId": "a0x9"
  }, "1"]
]</sourcecode>
        </figure>
        <t indent="0" pn="section-4.1-3">The server might respond with something like:</t>
        <figure align="left" suppress-title="false" pn="figure-2">
          <name slugifiedName="name-methodresponses-property-of">"methodResponses" Property of a JMAP Response</name>
          <sourcecode type="json" markers="false" pn="section-4.1-4.1">[
  ["AddressBook/get", {
    "accountId": "a0x9",
    "list": [{
      "id": "062adcfa-105d-455c-bc60-6db68b69c3f3",
      "name": "Personal",
      "description": null,
      "sortOrder": 0,
      "isDefault": true,
      "isSubscribed": true,
      "shareWith": {
        "3f1502e0-63fe-4335-9ff3-e739c188f5dd": {
          "mayRead": true,
          "mayWrite": false,
          "mayShare": false,
          "mayDelete": false
        }
      },
      "myRights": {
        "mayRead": true,
        "mayWrite": true,
        "mayShare": true,
        "mayDelete": false
      }
    }, {
      "id": "cd40089d-35f9-4fd7-980b-ba3a9f1d74fe",
      "name": "Autosaved",
      "description": null,
      "sortOrder": 1,
      "isDefault": false,
      "isSubscribed": true,
      "shareWith": null,
      "myRights": {
        "mayRead": true,
        "mayWrite": true,
        "mayShare": true,
        "mayDelete": false
      }
    }],
    "notFound": [],
    "state": "~4144"
  }, "0"],
  ["ContactCard/get", {
    "accountId": "a0x9",
    "list": [{
      "id": "3",
      "addressBookIds": {
        "062adcfa-105d-455c-bc60-6db68b69c3f3": true
      },
      "name": {
        "components": [
          { "kind": "given", "value": "Joe" },
          { "kind": "surname", "value": "Bloggs" }
        ],
        "isOrdered": true
      },
      "emails": {
        "0": {
          "contexts": {
            "private": true
          },
          "address": "joe.bloggs@example.com"
        }
      }
    }],
    "notFound": [],
    "state": "ewarbckaqJ::112"
  }, "1"]
]</sourcecode>
        </figure>
      </section>
      <section anchor="changing-the-default-address-book" numbered="true" removeInRFC="false" toc="include" pn="section-4.2">
        <name slugifiedName="name-changing-the-default-addres">Changing the Default Address Book</name>
        <t indent="0" pn="section-4.2-1">The client tries to change the default address book from "Personal" to "Autosaved" (and makes no other change):</t>
        <figure align="left" suppress-title="false" pn="figure-3">
          <name slugifiedName="name-methodcalls-property-of-a-jm">"methodCalls" Property of a JMAP Request</name>
          <sourcecode type="json" markers="false" pn="section-4.2-2.1">[
  ["AddressBook/set", {
    "accountId": "a0x9",
    "onSuccessSetIsDefault": "cd40089d-35f9-4fd7-980b-ba3a9f1d74fe"
  }, "0"]
]</sourcecode>
        </figure>
        <t indent="0" pn="section-4.2-3">The server allows the change, returning the following response:</t>
        <figure align="left" suppress-title="false" pn="figure-4">
          <name slugifiedName="name-methodresponses-property-of-">"methodResponses" Property of a JMAP Response</name>
          <sourcecode type="json" markers="false" pn="section-4.2-4.1">[
  ["AddressBook/set", {
    "accountId": "a0x9",
    "updated": {
      "cd40089d-35f9-4fd7-980b-ba3a9f1d74fe": {
        "isDefault": true
      },
      "062adcfa-105d-455c-bc60-6db68b69c3f3": {
        "isDefault": false
      },
      "oldState": "~4144",
      "newState": "~4148"
    }
  }, "0"]
]</sourcecode>
        </figure>
      </section>
    </section>
    <section numbered="true" removeInRFC="false" toc="include" pn="section-5">
      <name slugifiedName="name-internationalisation-consid">Internationalisation Considerations</name>
      <t indent="0" pn="section-5-1">Experience has shown that unrestricted use of Unicode can lead to problems such as inconsistent rendering, users reading text and interpreting it differently than intended, and unexpected results when copying text from one location to another. Servers <bcp14>MAY</bcp14> choose to mitigate this by restricting the set of characters allowed in otherwise unconstrained <tt>String</tt> fields. The FreeformClass, as documented in <xref target="RFC8264" section="4.3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8264#section-4.3" derivedContent="RFC8264"/>, might be a good starting point for 
this.</t>
      <t indent="0" pn="section-5-2">Attempts to set a value containing code points outside of the permissible set can be handled in a few ways by the server. The server could choose to strip the forbidden characters or replace them with U+FFFD (the Unicode replacement character) and store the resulting string. This is likely to be appropriate for non-printable characters -- such as the "Control Codes" defined in <eref target="https://www.unicode.org/versions/latest/core-spec/chapter-23/#G20365" brackets="none">Section 23.1</eref> of <xref target="UNICODE" format="default" sectionFormat="of" derivedContent="UNICODE"/>, excluding newline (U+000A), carriage return (U+000D), and tab (U+0009) -- that can end up in data accidentally due to copy-and-paste issues but are invisible to the end user. JMAP allows the server to transform data on create/update as long as any changed properties are returned to the client in the "/set" response so it knows what has changed, as per <xref target="RFC8620" section="5.3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-5.3" derivedContent="RFC8620"/>. Alternatively, the server <bcp14>MAY</bcp14> just reject the create/update with an "invalidProperties" SetError.</t>
    </section>
    <section anchor="security-considerations" numbered="true" removeInRFC="false" toc="include" pn="section-6">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-6-1">All security considerations of JMAP <xref target="RFC8620" format="default" sectionFormat="of" derivedContent="RFC8620"/> apply to this specification. Additional considerations specific to the data types and functionality introduced by this document are described in the following subsection.</t>
      <t indent="0" pn="section-6-2">Contacts consist almost entirely of private, personally identifiable information, and represent the social connections of users. Privacy leaks can have real world consequences, and contact servers and clients <bcp14>MUST</bcp14> be mindful of the need to keep all data secure.</t>
      <t indent="0" pn="section-6-3">Servers <bcp14>MUST</bcp14> enforce the Access Control Lists (ACLs) set on address books to ensure only authorised data is shared.</t>
    </section>
    <section anchor="iana-considerations" numbered="true" removeInRFC="false" toc="include" pn="section-7">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <section anchor="jmap-capability-registration-for-contacts" numbered="true" removeInRFC="false" toc="include" pn="section-7.1">
        <name slugifiedName="name-jmap-capability-registratio">JMAP Capability Registration for "contacts"</name>
        <t indent="0" pn="section-7.1-1">IANA has registered "contacts" in the "JMAP Capabilities" registry as follows:</t>
        <dl newline="false" spacing="compact" indent="3" pn="section-7.1-2">
          <dt pn="section-7.1-2.1">Capability Name:</dt>
          <dd pn="section-7.1-2.2">
            <tt>urn:ietf:params:jmap:contacts</tt></dd>
          <dt pn="section-7.1-2.3">Intended Use:</dt>
          <dd pn="section-7.1-2.4">common</dd>
          <dt pn="section-7.1-2.5">Change Controller:</dt>
          <dd pn="section-7.1-2.6">IETF</dd>
          <dt pn="section-7.1-2.7">Security and Privacy Considerations:</dt>
          <dd pn="section-7.1-2.8">this document, <xref target="security-considerations" format="default" sectionFormat="of" derivedContent="Section 6"/></dd>
          <dt pn="section-7.1-2.9">Reference:</dt>
          <dd pn="section-7.1-2.10">this document</dd>
        </dl>
      </section>
      <section anchor="jmap-data-type-registration-for-addressbook" numbered="true" removeInRFC="false" toc="include" pn="section-7.2">
        <name slugifiedName="name-jmap-data-type-registration">JMAP Data Type Registration for "AddressBook"</name>
        <t indent="0" pn="section-7.2-1">IANA has registered "AddressBook" in the "JMAP Data Types" registry as follows:</t>
        <dl newline="false" spacing="compact" indent="3" pn="section-7.2-2">
          <dt pn="section-7.2-2.1">Type Name:</dt>
          <dd pn="section-7.2-2.2">
            <tt>AddressBook</tt></dd>
          <dt pn="section-7.2-2.3">Can Reference Blobs:</dt>
          <dd pn="section-7.2-2.4">No</dd>
          <dt pn="section-7.2-2.5">Can Use for State Change:</dt>
          <dd pn="section-7.2-2.6">Yes</dd>
          <dt pn="section-7.2-2.7">Capability:</dt>
          <dd pn="section-7.2-2.8">
            <tt>urn:ietf:params:jmap:contacts</tt></dd>
          <dt pn="section-7.2-2.9">Reference:</dt>
          <dd pn="section-7.2-2.10">this document</dd>
        </dl>
      </section>
      <section anchor="jmap-data-type-registration-for-contactcard" numbered="true" removeInRFC="false" toc="include" pn="section-7.3">
        <name slugifiedName="name-jmap-data-type-registration-">JMAP Data Type Registration for "ContactCard"</name>
        <t indent="0" pn="section-7.3-1">IANA has registered "ContactCard" in the "JMAP Data Types" registry as follows:</t>
        <dl newline="false" spacing="compact" indent="3" pn="section-7.3-2">
          <dt pn="section-7.3-2.1">Type Name:</dt>
          <dd pn="section-7.3-2.2">
            <tt>ContactCard</tt></dd>
          <dt pn="section-7.3-2.3">Can Reference Blobs:</dt>
          <dd pn="section-7.3-2.4">Yes</dd>
          <dt pn="section-7.3-2.5">Can Use for State Change:</dt>
          <dd pn="section-7.3-2.6">Yes</dd>
          <dt pn="section-7.3-2.7">Capability:</dt>
          <dd pn="section-7.3-2.8">
            <tt>urn:ietf:params:jmap:contacts</tt></dd>
          <dt pn="section-7.3-2.9">Reference:</dt>
          <dd pn="section-7.3-2.10">this document</dd>
        </dl>
      </section>
      <section anchor="jmap-error-codes-registry" numbered="true" removeInRFC="false" toc="include" pn="section-7.4">
        <name slugifiedName="name-jmap-error-codes-registry">JMAP Error Codes Registry</name>
        <t indent="0" pn="section-7.4-1">The following subsection has registered a new error code in the "JMAP
Error Codes" registry, as defined in <xref target="RFC8620" section="9" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc8620#section-9" derivedContent="RFC8620"/>.
</t>
        <section anchor="addressbookhascontents" numbered="true" removeInRFC="false" toc="include" pn="section-7.4.1">
          <name slugifiedName="name-addressbookhascontents">addressBookHasContents</name>
          <dl newline="false" spacing="compact" indent="3" pn="section-7.4.1-1">
            <dt pn="section-7.4.1-1.1">JMAP Error Code:</dt>
            <dd pn="section-7.4.1-1.2">addressBookHasContents</dd>
            <dt pn="section-7.4.1-1.3">Intended Use:</dt>
            <dd pn="section-7.4.1-1.4">common</dd>
            <dt pn="section-7.4.1-1.5">Change Controller:</dt>
            <dd pn="section-7.4.1-1.6">IETF</dd>
            <dt pn="section-7.4.1-1.7">Description:</dt>
            <dd pn="section-7.4.1-1.8">The AddressBook has at least one ContactCard assigned to it, and the "onDestroyRemoveContents" argument was false.</dd>
            <dt pn="section-7.4.1-1.9">Reference:</dt>
            <dd pn="section-7.4.1-1.10">This document, <xref target="addressbook-set" format="default" sectionFormat="of" derivedContent="Section 2.3"/></dd>
          </dl>
        </section>
      </section>
      <section anchor="jscontact-property-registrations" numbered="true" removeInRFC="false" toc="include" pn="section-7.5">
        <name slugifiedName="name-jscontact-property-registra">JSContact Property Registrations</name>
        <t indent="0" pn="section-7.5-1">IANA has registered the following additional properties in the "JSContact Properties" registry, as defined in <xref target="RFC9553" section="3" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc9553#section-3" derivedContent="RFC9553"/>.</t>
        <section anchor="id" numbered="true" removeInRFC="false" toc="include" pn="section-7.5.1">
          <name slugifiedName="name-id">id</name>
          <dl newline="false" spacing="compact" indent="3" pn="section-7.5.1-1">
            <dt pn="section-7.5.1-1.1">Property Name:</dt>
            <dd pn="section-7.5.1-1.2">id</dd>
            <dt pn="section-7.5.1-1.3">Property Type:</dt>
            <dd pn="section-7.5.1-1.4">not applicable</dd>
            <dt pn="section-7.5.1-1.5">Property Context:</dt>
            <dd pn="section-7.5.1-1.6">Card</dd>
            <dt pn="section-7.5.1-1.7">Intended Usage:</dt>
            <dd pn="section-7.5.1-1.8">reserved</dd>
            <dt pn="section-7.5.1-1.9">Since Version:</dt>
            <dd pn="section-7.5.1-1.10">1.0</dd>
            <dt pn="section-7.5.1-1.11">Change Controller:</dt>
            <dd pn="section-7.5.1-1.12">IETF</dd>
            <dt pn="section-7.5.1-1.13">Reference:</dt>
            <dd pn="section-7.5.1-1.14">this document</dd>
          </dl>
        </section>
        <section anchor="addressBookIds" numbered="true" removeInRFC="false" toc="include" pn="section-7.5.2">
          <name slugifiedName="name-addressbookids">addressBookIds</name>
          <dl newline="false" spacing="compact" indent="3" pn="section-7.5.2-1">
            <dt pn="section-7.5.2-1.1">Property Name:</dt>
            <dd pn="section-7.5.2-1.2">addressBookIds</dd>
            <dt pn="section-7.5.2-1.3">Property Type:</dt>
            <dd pn="section-7.5.2-1.4">not applicable</dd>
            <dt pn="section-7.5.2-1.5">Property Context:</dt>
            <dd pn="section-7.5.2-1.6">Card</dd>
            <dt pn="section-7.5.2-1.7">Intended Usage:</dt>
            <dd pn="section-7.5.2-1.8">reserved</dd>
            <dt pn="section-7.5.2-1.9">Since Version:</dt>
            <dd pn="section-7.5.2-1.10">1.0</dd>
            <dt pn="section-7.5.2-1.11">Change Controller:</dt>
            <dd pn="section-7.5.2-1.12">IETF</dd>
            <dt pn="section-7.5.2-1.13">Reference:</dt>
            <dd pn="section-7.5.2-1.14">this document</dd>
          </dl>
        </section>
        <section anchor="blobId" numbered="true" removeInRFC="false" toc="include" pn="section-7.5.3">
          <name slugifiedName="name-blobid">blobId</name>
          <dl newline="false" spacing="compact" indent="3" pn="section-7.5.3-1">
            <dt pn="section-7.5.3-1.1">Property Name:</dt>
            <dd pn="section-7.5.3-1.2">blobId</dd>
            <dt pn="section-7.5.3-1.3">Property Type:</dt>
            <dd pn="section-7.5.3-1.4">not applicable</dd>
            <dt pn="section-7.5.3-1.5">Property Context:</dt>
            <dd pn="section-7.5.3-1.6">Media</dd>
            <dt pn="section-7.5.3-1.7">Intended Usage:</dt>
            <dd pn="section-7.5.3-1.8">reserved</dd>
            <dt pn="section-7.5.3-1.9">Since Version:</dt>
            <dd pn="section-7.5.3-1.10">1.0</dd>
            <dt pn="section-7.5.3-1.11">Change Controller:</dt>
            <dd pn="section-7.5.3-1.12">IETF</dd>
            <dt pn="section-7.5.3-1.13">Reference:</dt>
            <dd pn="section-7.5.3-1.14">this document</dd>
          </dl>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references pn="section-8">
      <name slugifiedName="name-references">References</name>
      <references pn="section-8.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t indent="0">In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC2397" target="https://www.rfc-editor.org/info/rfc2397" quoteTitle="true" derivedAnchor="RFC2397">
          <front>
            <title>The "data" URL scheme</title>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="August" year="1998"/>
            <abstract>
              <t indent="0">A new URL scheme, "data", is defined. It allows inclusion of small data items as "immediate" data, as if it had been included externally. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2397"/>
          <seriesInfo name="DOI" value="10.17487/RFC2397"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t indent="0">RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8620" target="https://www.rfc-editor.org/info/rfc8620" quoteTitle="true" derivedAnchor="RFC8620">
          <front>
            <title>The JSON Meta Application Protocol (JMAP)</title>
            <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2019"/>
            <abstract>
              <t indent="0">This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8620"/>
          <seriesInfo name="DOI" value="10.17487/RFC8620"/>
        </reference>
        <reference anchor="RFC9553" target="https://www.rfc-editor.org/info/rfc9553" quoteTitle="true" derivedAnchor="RFC9553">
          <front>
            <title>JSContact: A JSON Representation of Contact Data</title>
            <author fullname="R. Stepanek" initials="R." surname="Stepanek"/>
            <author fullname="M. Loffredo" initials="M." surname="Loffredo"/>
            <date month="May" year="2024"/>
            <abstract>
              <t indent="0">This specification defines a data model and JavaScript Object Notation (JSON) representation of contact card information that can be used for data storage and exchange in address book or directory applications. It aims to be an alternative to the vCard data format and to be unambiguous, extendable, and simple to process. In contrast to the JSON-based jCard format, it is not a direct mapping 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.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9553"/>
          <seriesInfo name="DOI" value="10.17487/RFC9553"/>
        </reference>
        <reference anchor="RFC9670" target="https://www.rfc-editor.org/info/rfc9670" quoteTitle="true" derivedAnchor="RFC9670">
          <front>
            <title>JSON Meta Application Protocol (JMAP) Sharing</title>
            <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
            <date month="November" year="2024"/>
            <abstract>
              <t indent="0">This document specifies a data model for sharing data between users using the JSON Meta Application Protocol (JMAP). Future documents can reference this document when defining data types to support a consistent model of sharing.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9670"/>
          <seriesInfo name="DOI" value="10.17487/RFC9670"/>
        </reference>
      </references>
      <references pn="section-8.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="RFC8264" target="https://www.rfc-editor.org/info/rfc8264" quoteTitle="true" derivedAnchor="RFC8264">
          <front>
            <title>PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="M. Blanchet" initials="M." surname="Blanchet"/>
            <date month="October" year="2017"/>
            <abstract>
              <t indent="0">Application protocols using Unicode code points in protocol strings need to properly handle such strings in order to enforce internationalization rules for strings placed in various protocol slots (such as addresses and identifiers) and to perform valid comparison operations (e.g., for purposes of authentication or authorization). This document defines a framework enabling application protocols to perform the preparation, enforcement, and comparison of internationalized strings ("PRECIS") in a way that depends on the properties of Unicode code points and thus is more agile with respect to versions of Unicode. As a result, this framework provides a more sustainable approach to the handling of internationalized strings than the previous framework, known as Stringprep (RFC 3454). This document obsoletes RFC 7564.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8264"/>
          <seriesInfo name="DOI" value="10.17487/RFC8264"/>
        </reference>
        <reference anchor="UNICODE" target="https://www.unicode.org/versions/latest/" quoteTitle="true" derivedAnchor="UNICODE">
          <front>
            <title abbrev="Unicode">The Unicode Standard</title>
            <author>
              <organization showOnFrontPage="true">The Unicode Consortium</organization>
              <address/>
            </author>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.a">
      <name slugifiedName="name-authors-address">Author's Address</name>
      <author role="editor" initials="N." surname="Jenkins" fullname="Neil Jenkins">
        <organization showOnFrontPage="true">Fastmail</organization>
        <address>
          <postal>
            <street>PO Box 234, Collins St West</street>
            <city>Melbourne</city>
            <code>VIC 8007</code>
            <country>Australia</country>
          </postal>
          <email>neilj@fastmailteam.com</email>
          <uri>https://www.fastmail.com</uri>
        </address>
      </author>
    </section>
  </back>
</rfc>
