<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.34 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-jmap-metadata-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP Object Metadata">JMAP Object Metadata</title>

    <author initials="M." surname="De Gennaro" fullname="Mauro De Gennaro">
      <organization abbrev="Stalwart Labs">Stalwart Labs LLC</organization>
      <address>
        <postal>
          <street>1309 Coffeen Avenue, Suite 1200</street>
          <city>Sheridan</city>
          <region>WY</region>
          <code>82801</code>
          <country>USA</country>
        </postal>
        <email>mauro@stalw.art</email>
        <uri>https://stalw.art</uri>
      </address>
    </author>

    <date year="2026" month="October" day="19"/>

    
    <workgroup>JMAP</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 47?>

<t>This document defines an extension to the JSON Meta Application Protocol (JMAP) that lets clients and servers attach metadata to objects of existing JMAP data types. Each data type the server lists gains two new properties, <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>, whose values are objects keyed by <em>namespace identifier</em>. A namespace identifier is either a name registered with IANA or a domain name controlled by the vendor providing the namespace; the latter allows vendors and applications to extend the metadata schema without prior coordination. Because metadata is carried as a property on the related object, clients use the existing <spanx style="verb">/get</spanx>, <spanx style="verb">/set</spanx>, <spanx style="verb">/changes</spanx>, and <spanx style="verb">/query</spanx> methods to read, modify, and synchronize it.</t>



    </abstract>



  </front>

  <middle>


<?line 51?>

<section anchor="introduction"><name>Introduction</name>

<t>The JSON Meta Application Protocol (JMAP) <xref target="RFC8620"/> is a generic protocol for synchronizing data, such as mail, calendars or contacts, between a client and a server. It is optimized for mobile and web environments, and aims to provide a consistent interface to different data types.</t>

<t>Metadata, or annotations, are auxiliary data elements that provide additional context, user-defined properties, or system-specific information about primary data objects. They enable user annotations, application-specific settings, collaborative tagging, and similar functionality. Other protocols have addressed this need with mechanisms such as the IMAP METADATA extension <xref target="RFC5464"/> and WebDAV dead properties <xref target="RFC4918"/>; this specification provides an analogous facility within JMAP. The term "metadata" in this document refers only to the properties defined here, not to the Email properties described in <xref section="4.1.1" sectionFormat="of" target="RFC8621"/>.</t>

<t>This document defines a uniform mechanism for managing such metadata. Each listed JMAP data type gains a <spanx style="verb">metadata</spanx> property (shared metadata) and, optionally, a <spanx style="verb">privateMetadata</spanx> property (per-user metadata). The value of each property is an object keyed by <em>namespace identifier</em>. This document defines no initial namespaces; vendors use domain-name identifiers for proprietary extensions, and additional registered identifiers may be defined by future specifications.</t>

<t>Because metadata is carried as a property on the related object, the existing JMAP methods for that data type apply unchanged. Clients fetch metadata with the type's <spanx style="verb">/get</spanx> method, modify it through <spanx style="verb">/set</spanx> patches, learn of changes through <spanx style="verb">/changes</spanx>, and search across metadata and primary properties together through <spanx style="verb">/query</spanx>.</t>

<section anchor="notational-conventions"><name>Notational Conventions</name>

<t>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"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

<t>The definitions of JSON keys and datatypes in this document follow the conventions described in <xref section="1.1" sectionFormat="of" target="RFC8620"/>. The terms "Foo", "SetError", "PatchObject" and "state string" are used as defined in <xref target="RFC8620"/>. This document also uses the following terms:</t>

<t><list style="symbols">
  <t><em>related object</em>: the JMAP object carrying the <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> properties.</t>
  <t><em>listed data type</em>: a data type that appears in the <spanx style="verb">dataTypes</spanx> field of the account capability (<xref target="capability"></xref>).</t>
  <t><em>user</em>: the authenticated identity of the session, which is not necessarily the owner of the account.</t>
</list></t>

</section>
<section anchor="addition-to-the-capabilities-object"><name>Addition to the Capabilities Object</name>

<t>The capabilities object is returned as part of the JMAP Session object; see <xref section="2" sectionFormat="of" target="RFC8620"/>. This document defines one additional capability URI.</t>

<section anchor="capability"><name>urn:ietf:params:jmap:metadata</name>

<t>This capability represents support for the metadata extension defined in this document. Servers that include this capability provide the <spanx style="verb">metadata</spanx> and (optionally) <spanx style="verb">privateMetadata</spanx> properties on the data types they list.</t>

<t>The value of this property in the JMAP Session "capabilities" property is an empty object.</t>

<t>The value of this property in an account's "accountCapabilities" property is an object containing the following field:</t>

<dl newline="true">
  <dt><strong>dataTypes</strong>: <spanx style="verb">String[DataTypeMetadataInfo]</spanx></dt>
  <dd>
    <t>An object whose keys are the names of JMAP data types for which the server supports metadata in this account. A type that does not appear in this object does not gain the <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> properties in this account. The value associated with each type is a <spanx style="verb">DataTypeMetadataInfo</spanx> object as defined below.</t>
  </dd>
</dl>

<t>A <strong>DataTypeMetadataInfo</strong> object has the following fields:</t>

<dl newline="true">
  <dt><strong>namespaces</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>The set of IANA-registered metadata namespace names (as defined in <xref target="namespaces-registry"></xref>) that the server supports on this data type. Each value <bcp14>MUST</bcp14> be a registered name (<xref target="namespaces"></xref>). A registered namespace <bcp14>MUST NOT</bcp14> be listed for a data type, or written under a property, that its registration does not allow. Vendor (domain-name) namespaces <bcp14>MUST NOT</bcp14> appear in this list; their support is signalled by <spanx style="verb">supportsVendorNamespaces</spanx> instead.</t>
  </dd>
  <dt><strong>supportsVendorNamespaces</strong>: <spanx style="verb">Boolean</spanx> (default: false)</dt>
  <dd>
    <t>Indicates whether the server accepts vendor (domain-name) namespaces on this data type. If true, any well-formed domain-name namespace (<xref target="namespaces"></xref>) may be written by clients, subject to the other constraints of this specification (access control, <spanx style="verb">maxDepth</spanx>, quota). If false, any <spanx style="verb">/set</spanx> operation that targets a domain-name namespace <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError, and any subselector or filter condition referencing such a namespace <bcp14>MUST</bcp14> be treated as unsupported per the rules of <xref target="get-extension"></xref> and <xref target="filter-conditions"></xref>.</t>
  </dd>
  <dt><strong>supportsPrivate</strong>: <spanx style="verb">Boolean</spanx> (default: false)</dt>
  <dd>
    <t>Indicates whether this account, on this data type, supports per-user <spanx style="verb">privateMetadata</spanx>. This is a server feature flag, not a per-user permission. If false, the <spanx style="verb">privateMetadata</spanx> property <bcp14>MUST</bcp14> be absent from response objects of this type, all <spanx style="verb">privateMetadata*</spanx> filter conditions (<xref target="filter-conditions"></xref>) <bcp14>MUST</bcp14> be rejected with an "unsupportedFilter" error, and any <spanx style="verb">/set</spanx> operation that targets <spanx style="verb">privateMetadata</spanx> <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError. Per-user authorization of a <spanx style="verb">privateMetadata</spanx> write that the server otherwise supports is defined in <xref target="access-control"></xref>.</t>
  </dd>
  <dt><strong>maxDepth</strong>: <spanx style="verb">UnsignedInt|null</spanx> (default: null)</dt>
  <dd>
    <t>Maximum depth of nested objects within a namespace value on this data type. A depth of 1 indicates only flat properties are supported; a depth of 2 allows one level of nesting; and so forth. If not <spanx style="verb">null</spanx>, the value <bcp14>MUST</bcp14> be at least 1. A value of <spanx style="verb">null</spanx> means there is no server-enforced depth limit beyond quota and size limits. Depth is defined in <xref target="namespaces"></xref>.</t>
  </dd>
</dl>

<t>A server <bcp14>SHOULD NOT</bcp14> advertise a data type that supports neither registered namespaces (empty <spanx style="verb">namespaces</spanx>) nor vendor namespaces (<spanx style="verb">supportsVendorNamespaces: false</spanx>), since such an entry advertises support for nothing. If no data type would be listed in <spanx style="verb">dataTypes</spanx>, the server <bcp14>SHOULD NOT</bcp14> include the capability in the account's "accountCapabilities".</t>

<t>A worked example of the capability object appears in <xref target="example-capability"></xref>.</t>

</section>
</section>
</section>
<section anchor="the-metadata-properties"><name>The Metadata Properties</name>

<t>This extension introduces two properties on each listed data type:</t>

<dl newline="true">
  <dt><strong>metadata</strong>: <spanx style="verb">String[Object]</spanx> (default: <spanx style="verb">{}</spanx>)</dt>
  <dd>
    <t>An object containing shared metadata associated with the object. Each key is a namespace identifier (see <xref target="namespaces"></xref>) and each value is structured according to the namespace's definition. Shared metadata is visible to every user with read access to the related object, subject to <xref target="access-control"></xref>. When returned, its value <bcp14>MUST</bcp14> be an object (<spanx style="verb">{}</spanx> when no metadata is set), never <spanx style="verb">null</spanx>.</t>
  </dd>
  <dt><strong>privateMetadata</strong>: <spanx style="verb">String[Object]</spanx> (default: <spanx style="verb">{}</spanx>)</dt>
  <dd>
    <t>An object containing per-user metadata associated with the object, with the same structure as <spanx style="verb">metadata</spanx>. Private metadata is visible only to the user who set it; the server <bcp14>MUST</bcp14> filter responses so that each user sees only their own <spanx style="verb">privateMetadata</spanx> content, as described in <xref target="access-control"></xref>. When returned, its value <bcp14>MUST</bcp14> be an object (<spanx style="verb">{}</spanx> if the user has set no private metadata on the object), never <spanx style="verb">null</spanx>. When <spanx style="verb">supportsPrivate</spanx> is false for the data type, this property <bcp14>MUST NOT</bcp14> be returned.</t>
  </dd>
</dl>

<t>Both properties are mutable and behave like any other property of the related object. They appear in <spanx style="verb">/get</spanx> responses, accept patches through <spanx style="verb">/set</spanx>, contribute to the related type's state string (<xref target="state-behavior"></xref>), and may be searched through the <spanx style="verb">/query</spanx> filter conditions defined in <xref target="filter-conditions"></xref>.</t>

<section anchor="namespaces"><name>Namespaces</name>

<t>The keys of the <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> objects are <em>namespace identifiers</em>. Each identifier <bcp14>MUST</bcp14> be one of:</t>

<t><list style="symbols">
  <t>A <em>registered name</em>: a sequence of lowercase US-ASCII letters, digits, hyphens, and underscores, with no dot ("."). Registered names may be registered using the procedure in <xref target="namespaces-registry"></xref>; this document defines no registered names.</t>
  <t>A <em>domain name</em> controlled by the vendor providing the namespace, in DNS form (containing at least one ".", e.g., <spanx style="verb">example.com</spanx>, <spanx style="verb">acme.example.org</spanx>). Vendors <bcp14>MAY</bcp14> use domain-name namespaces for proprietary metadata without registration; the dot in the name guarantees no collision with registered names. Domain-name identifiers <bcp14>MUST</bcp14> be in lowercase, with internationalized labels in A-label form. Servers <bcp14>MUST</bcp14> reject, with an "invalidProperties" SetError, a <spanx style="verb">/set</spanx> operation that uses a key that is not a valid namespace identifier, including a domain name containing uppercase ASCII letters.</t>
</list></t>

<t>A namespace is <em>supported</em> on a data type if it is a registered name listed in that type's <spanx style="verb">namespaces</spanx>, or a domain name and the type's <spanx style="verb">supportsVendorNamespaces</spanx> is true.</t>

<t>The value associated with each namespace key <bcp14>MUST</bcp14> be a JSON object, whose internal structure is defined by the specification or vendor owning that namespace; a namespace set to <spanx style="verb">{}</spanx> remains stored until it is removed with <spanx style="verb">null</spanx>. Property names within the namespace object follow normal JSON conventions; they do not need to be domain-prefixed, since cross-namespace isolation is already provided by the top-level key.</t>

<t>Example:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "metadata": {
    "acme.example.com": {
      "color": "blue",
      "priority": "high",
      "project": {
        "id": "ALPHA-2024",
        "deadline": "2024-12-31"
      }
    }
  }
}
]]></sourcecode></figure>

<t>The depth of a value is defined recursively: a scalar (string, number, boolean or null) has depth 0; an array has the maximum depth of its elements (0 if empty); an object has depth 1 plus the maximum depth of its member values (1 if empty). For example, <spanx style="verb">{"a": 1}</spanx> has depth 1 and <spanx style="verb">{"x": [{"y": 1}]}</spanx> has depth 2. If the account capability specifies a <spanx style="verb">maxDepth</spanx> for a data type, the depth of a namespace value <bcp14>MUST NOT</bcp14> exceed it; servers <bcp14>MUST</bcp14> reject writes that would exceed it with an "invalidProperties" SetError.</t>

<t>A patch that targets one namespace <bcp14>MUST NOT</bcp14> remove or alter any other namespace, including namespaces that are not supported on the data type.</t>

<t>Vendors are encouraged to register namespace identifiers that are likely to be useful beyond the vendor's own products, using the procedure in <xref target="namespaces-registry"></xref>. Registration enhances interoperability and avoids fragmentation.</t>

<section anchor="namespace-removal"><name>Data in Unsupported Namespaces</name>

<t>Data can be stored under a namespace that is not supported on the data type, for example after a server reconfiguration, after a vendor withdraws support, or when the data was copied from another account (<xref target="copy"></xref>). Such data <bcp14>MUST</bcp14> continue to be returned by <spanx style="verb">/get</spanx> for read-only access. Any <spanx style="verb">/set</spanx> operation that targets the namespace, other than a patch that removes the namespace entirely (<spanx style="verb">"metadata/&lt;namespace&gt;": null</spanx> or <spanx style="verb">"privateMetadata/&lt;namespace&gt;": null</spanx>), <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError. A complete replacement of <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> <bcp14>MAY</bcp14> include such a namespace only with a value equal to the stored one, where two JSON objects are equal when they have the same members with equal values, regardless of member order; omitting the namespace from a complete replacement removes it. This ensures clients can always migrate data off an unsupported namespace, but cannot continue to extend it.</t>

</section>
</section>
<section anchor="state-behavior"><name>State Behavior</name>

<t>Changes to <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> are changes to the related object. They advance the related type's state string, appear in the related type's <spanx style="verb">/changes</spanx> response, and are otherwise indistinguishable from changes to any other property of that type, with the following clarification:</t>

<t>Because <spanx style="verb">privateMetadata</spanx> is filtered per viewer, a change made by user A to <spanx style="verb">privateMetadata</spanx> on a shared object <bcp14>MUST</bcp14> advance the related type's state string for user A and <bcp14>SHOULD NOT</bcp14> advance it for any other user. Such a change <bcp14>MUST NOT</bcp14> cause the object to be reported in any other user's <spanx style="verb">Foo/changes</spanx> or <spanx style="verb">Foo/queryChanges</spanx> response. A server that advances other users' state reveals when a private change occurred (see <xref target="security-considerations"></xref>).</t>

<t>Changes to <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> alone <bcp14>MUST NOT</bcp14> update server-maintained modification timestamps of the related object, such as the <spanx style="verb">changed</spanx> property of FileNode <xref target="I-D.ietf-jmap-filenode"/> or the <spanx style="verb">updated</spanx> property of CalendarEvent <xref target="I-D.ietf-jmap-calendars"/>. This overrides any requirement of those specifications that the timestamp change on every update.</t>

</section>
</section>
<section anchor="standard-method-extensions"><name>Standard Method Extensions</name>

<t>For each data type listed in the <spanx style="verb">dataTypes</spanx> field of the account capability, the standard JMAP methods for that type are extended as described in the following subsections; a server <bcp14>MUST</bcp14> implement these extensions for every listed data type.</t>

<t>These extensions apply to requests whose <spanx style="verb">using</spanx> includes <spanx style="verb">urn:ietf:params:jmap:metadata</spanx>. For other requests, <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> are not default properties of <spanx style="verb">Foo/get</spanx> (although they are still returned when requested by name), <spanx style="verb">Foo/set</spanx> <bcp14>MUST</bcp14> reject any write to them with an "invalidProperties" SetError, and <spanx style="verb">Foo/changes</spanx> <bcp14>MUST</bcp14> behave as if <spanx style="verb">ignoreMetadataOnlyChanges</spanx> were true. The state string is the same as for requests that use this capability.</t>

<t>This document does not extend methods that create or parse objects from uploaded data, such as <spanx style="verb">Email/import</spanx> and <spanx style="verb">Email/parse</spanx> (<xref target="RFC8621"/>). Objects created or returned by such methods have empty <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>.</t>

<section anchor="get-extension"><name>/get</name>

<t>For a listed data type, when <spanx style="verb">properties</spanx> is omitted or <spanx style="verb">null</spanx>, the server <bcp14>MUST</bcp14> include <spanx style="verb">metadata</spanx> and, where <spanx style="verb">supportsPrivate</spanx> is true, <spanx style="verb">privateMetadata</spanx> in each returned object, except for <spanx style="verb">Email/get</spanx>, whose default property list (<xref section="4.2" sectionFormat="of" target="RFC8621"/>) is unchanged. The two properties may also be requested explicitly by name in the <spanx style="verb">properties</spanx> array, like any other JMAP property.</t>

<t>When a client wants only a subset of the metadata, it <bcp14>MAY</bcp14> request individual namespaces using slash-separated subselector paths in the <spanx style="verb">properties</spanx> argument. The following rules apply to subselectors introduced by this specification:</t>

<t><list style="symbols">
  <t>A subselector has the form <spanx style="verb">metadata/&lt;namespace&gt;</spanx> or <spanx style="verb">privateMetadata/&lt;namespace&gt;</spanx>, where <spanx style="verb">&lt;namespace&gt;</spanx> is a non-empty namespace identifier. Any other <spanx style="verb">properties</spanx> entry beginning with <spanx style="verb">metadata/</spanx> or <spanx style="verb">privateMetadata/</spanx> <bcp14>MUST</bcp14> be rejected with an "invalidArguments" method-level error.</t>
  <t>Multiple subselectors with the same root combine by union. For example, <spanx style="verb">["metadata/x", "metadata/y"]</spanx> returns <spanx style="verb">{"metadata": {"x": ..., "y": ...}}</spanx> (and nothing else under <spanx style="verb">metadata</spanx>).</t>
  <t>An explicit root entry supersedes subselectors with the same root. For example, <spanx style="verb">["metadata", "metadata/x"]</spanx> returns the complete <spanx style="verb">metadata</spanx> object; the <spanx style="verb">metadata/x</spanx> entry is redundant rather than restrictive.</t>
  <t>A subselector naming a namespace that is not supported (<xref target="namespaces"></xref>) on the data type <bcp14>MUST</bcp14> be silently omitted from the response, unless the object has data stored under that namespace (<xref target="namespace-removal"></xref>), which is then returned. This lets clients perform capability-tolerant fetches without first consulting the session capability.</t>
  <t>This specification defines slash-path subselectors only for <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>. The use of slash-path subselectors with any other property name is outside the scope of this document.</t>
</list></t>

</section>
<section anchor="set"><name>/set</name>

<t>The <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> properties are mutable.</t>

<t>In a <spanx style="verb">create</spanx> entry of <spanx style="verb">Foo/set</spanx>, each property's value <bcp14>MUST</bcp14> be a complete JSON object (possibly the empty object <spanx style="verb">{}</spanx>). A value of <spanx style="verb">null</spanx> for either property <bcp14>MUST</bcp14> be rejected with an "invalidProperties" SetError; the canonical "no metadata" form is <spanx style="verb">{}</spanx>. In an <spanx style="verb">update</spanx>, <spanx style="verb">null</spanx> is equivalent to <spanx style="verb">{}</spanx>.</t>

<t>In an <spanx style="verb">update</spanx> entry of <spanx style="verb">Foo/set</spanx>, clients <bcp14>MAY</bcp14> either send a complete object as the value of <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> (replacing the previous value entirely), or use the PatchObject form (<xref section="5.3" sectionFormat="of" target="RFC8620"/>). Patch paths start with <spanx style="verb">metadata/&lt;namespace&gt;</spanx> or <spanx style="verb">privateMetadata/&lt;namespace&gt;</spanx> (replacing or removing an entire namespace value) and <bcp14>MAY</bcp14> continue to any depth below it (for example, <spanx style="verb">metadata/&lt;namespace&gt;/&lt;key&gt;/&lt;subkey&gt;</spanx>), with the semantics of <xref section="5.3" sectionFormat="of" target="RFC8620"/>: the parent of the target <bcp14>MUST</bcp14> exist, and a path that traverses an array is rejected with an "invalidPatch" SetError.</t>

<t>Setting a patch value to <spanx style="verb">null</spanx> removes the targeted key, per standard PatchObject semantics (<xref section="5.3" sectionFormat="of" target="RFC8620"/>). Setting a path to a complete object value replaces whatever was previously at that path; in particular, a patch of the shape <spanx style="verb">"metadata/&lt;namespace&gt;": { ... }</spanx> replaces the entire content of that namespace, deleting any keys not present in the new value. Clients that want to add or update individual properties without removing others need to patch the specific keys.</t>

<t>The server <bcp14>MUST</bcp14> validate every write against the account capability for the data type. When more than one of the following rules applies, the server <bcp14>MUST</bcp14> evaluate them in the order listed; the first matching rule determines the SetError:</t>

<t><list style="numbers" type="1">
  <t>If the user cannot read the related object, reject with "notFound". If the write targets <spanx style="verb">metadata</spanx> and the user lacks <spanx style="verb">maySetMetadata</spanx> (<xref target="maysetmetadata"></xref>), reject with "forbidden".</t>
  <t>If the path begins with <spanx style="verb">privateMetadata</spanx> and <spanx style="verb">supportsPrivate</spanx> is false for this data type, reject with "invalidProperties".</t>
  <t>If the targeted namespace is not supported on this data type, reject with "invalidProperties" (except for the migration case in <xref target="namespace-removal"></xref>).</t>
  <t>If a namespace value would exceed <spanx style="verb">maxDepth</spanx>, reject with "invalidProperties".</t>
</list></t>

<t>Patch errors that can be determined from the request alone (for example, two paths where one is a prefix of the other) <bcp14>MUST</bcp14> be reported with "invalidPatch" before rule 1 is evaluated. Patch errors that depend on the current value of the property (a missing parent, or a path through an array) <bcp14>MUST</bcp14> be reported with "invalidPatch" after rule 3 and before rule 4.</t>

<section anchor="quota-enforcement-on-set"><name>Quota Enforcement on /set</name>

<t>Servers <bcp14>SHOULD</bcp14> enforce quota limits on the total storage consumed by metadata within an account, as described in <xref target="quota"></xref>. If a create, update, or copy would cause the account to exceed its metadata quota, the server <bcp14>MUST</bcp14> reject the operation with an "overQuota" SetError.</t>

</section>
</section>
<section anchor="changes-extension"><name>/changes</name>

<t>For each data type listed in <spanx style="verb">dataTypes</spanx>, the <spanx style="verb">Foo/changes</spanx> request accepts the following additional optional argument:</t>

<dl newline="true">
  <dt><strong>ignoreMetadataOnlyChanges</strong>: <spanx style="verb">Boolean</spanx> (default: false)</dt>
  <dd>
    <t>If true, the server <bcp14>MUST</bcp14> exclude from the <spanx style="verb">updated</spanx> array any id whose only changes since <spanx style="verb">sinceState</spanx>, from the viewer's perspective, are confined to <spanx style="verb">metadata</spanx> and/or <spanx style="verb">privateMetadata</spanx>. Ids with any other change remain in <spanx style="verb">updated</spanx>. If the server cannot determine that an id's changes are metadata-only, it <bcp14>MUST</bcp14> include the id. Excluded ids do not count toward <spanx style="verb">maxChanges</spanx>. The state string still advances normally, so a client using this argument continues to see correct synchronization for all non-metadata-only changes; metadata-only changes are simply not reported to this client. When this argument is true, <spanx style="verb">updatedProperties</spanx> (defined below) <bcp14>MUST NOT</bcp14> list <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx>. For <spanx style="verb">Mailbox/changes</spanx> it may list the count properties (<xref section="2.2" sectionFormat="of" target="RFC8621"/>); for other types it <bcp14>MUST</bcp14> be <spanx style="verb">null</spanx>.</t>
  </dd>
</dl>

<t>The response is extended to include the following additional argument:</t>

<dl>
  <dt><strong>updatedProperties</strong>: <spanx style="verb">String[]|null</spanx></dt>
  <dd>
    <t>This argument is determined <em>per viewer</em>: each user's <spanx style="verb">Foo/changes</spanx> response is computed against the changes visible to that user (in particular, <spanx style="verb">privateMetadata</spanx> written by other users is invisible). If, from the viewer's perspective, the only properties that have changed on every id in the <spanx style="verb">updated</spanx> array since the old state are <spanx style="verb">metadata</spanx> and/or <spanx style="verb">privateMetadata</spanx>, this argument <bcp14>MUST</bcp14> be set to a list containing only those property names (e.g., <spanx style="verb">["metadata"]</spanx>, <spanx style="verb">["privateMetadata"]</spanx>, or <spanx style="verb">["metadata", "privateMetadata"]</spanx>). If any other property (apart from the Mailbox count properties described below) of any id in the array may also have changed (from the viewer's perspective), or if the server cannot determine the answer for any id in the array, this argument <bcp14>MUST</bcp14> be <spanx style="verb">null</spanx>. The argument applies uniformly to all ids in <spanx style="verb">updated</spanx>; per-id granularity is not provided. It is always present, and is <spanx style="verb">null</spanx> when <spanx style="verb">updated</spanx> is empty.</t>
  </dd>
</dl>

<t>This argument follows the same convention used by <spanx style="verb">Mailbox/changes</spanx> in <xref section="2.2" sectionFormat="of" target="RFC8621"/>. For <spanx style="verb">Mailbox/changes</spanx>, when every id in <spanx style="verb">updated</spanx> changed only in its counts (as defined there) and/or in <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx>, the value is the union of the count property names and the metadata property names that may have changed.</t>

</section>
<section anchor="copy"><name>/copy</name>

<t><spanx style="verb">Foo/copy</spanx> copies <spanx style="verb">metadata</spanx> to the new object. The copying user's <spanx style="verb">privateMetadata</spanx> on the source object becomes that user's <spanx style="verb">privateMetadata</spanx> on the new object; other users' <spanx style="verb">privateMetadata</spanx> <bcp14>MUST NOT</bcp14> be copied. When the request does not use this capability, only <spanx style="verb">metadata</spanx> is copied. The create object <bcp14>MAY</bcp14> include <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> to override the copied values, with the same rules as a create in <spanx style="verb">Foo/set</spanx>; for <spanx style="verb">Email/copy</spanx>, this extends the list of properties that may be set in <xref section="4.7" sectionFormat="of" target="RFC8621"/>. Copied metadata counts against quota (<xref target="quota"></xref>) as any other write.</t>

<t>Copied values are not revalidated against the destination account: data in a copied namespace that is not supported there is handled as described in <xref target="namespace-removal"></xref>, and <spanx style="verb">maxDepth</spanx> applies only to values supplied in the create object. <spanx style="verb">privateMetadata</spanx> is not copied when the destination does not support it, and neither property is copied when the data type is not listed in the destination account. With <spanx style="verb">onSuccessDestroyOriginal</spanx>, other users' <spanx style="verb">privateMetadata</spanx> on the source object is destroyed together with it.</t>

</section>
<section anchor="querychanges"><name>/queryChanges</name>

<t><spanx style="verb">Foo/queryChanges</spanx> is unchanged in its method signature and follows the per-viewer rule in <xref target="state-behavior"></xref>.</t>

</section>
<section anchor="filter-conditions"><name>/query</name>

<t>For each data type listed in <spanx style="verb">dataTypes</spanx>, the FilterCondition object for <spanx style="verb">Foo/query</spanx> is extended with the optional fields defined below. Several of those fields take a <spanx style="verb">MetadataTextMatch</spanx> value.</t>

<t>A <strong>MetadataTextMatch</strong> object has the following fields:</t>

<dl newline="true">
  <dt><strong>path</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The path within the metadata object to match against: a namespace identifier, optionally followed by a JSON Pointer <xref target="RFC6901"/> into the namespace value (for example, <spanx style="verb">&lt;namespace&gt;</spanx>, <spanx style="verb">&lt;namespace&gt;/&lt;key&gt;</spanx> or <spanx style="verb">&lt;namespace&gt;/&lt;key&gt;/&lt;subkey&gt;</spanx>). Object members are addressed by name; a path that would traverse an array or a scalar addresses no value. A path that is not well formed (for example, one with an invalid <spanx style="verb">~</spanx> escape) <bcp14>MUST</bcp14> be rejected with an "invalidArguments" error.</t>
  </dd>
  <dt><strong>value</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The string to search for at <spanx style="verb">path</spanx>. The interpretation of this string (substring containment versus exact equality) is determined by the FilterCondition field that carries the <spanx style="verb">MetadataTextMatch</spanx>.</t>
  </dd>
</dl>

<t>The extended FilterCondition fields are:</t>

<dl newline="true">
  <dt><strong>metadataExists</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>A path, with the syntax defined for <spanx style="verb">MetadataTextMatch</spanx>. Matches an object if and only if a value is present at the given path within the object's <spanx style="verb">metadata</spanx> property. A namespace-only path matches if the namespace key is present and its value is not the empty object <spanx style="verb">{}</spanx>.</t>
  </dd>
  <dt><strong>privateMetadataExists</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>As <spanx style="verb">metadataExists</spanx>, but matches against the authenticated user's <spanx style="verb">privateMetadata</spanx>.</t>
  </dd>
  <dt><strong>metadataTextContains</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>Matches an object if the <spanx style="verb">metadata</spanx> value at the supplied <spanx style="verb">path</spanx> is a string that contains the supplied <spanx style="verb">value</spanx> as a substring under the "i;unicode-casemap" collation <xref target="RFC5051"/>. The condition does not match if the path does not exist within <spanx style="verb">metadata</spanx>, or if the value at the path is not a string.</t>
  </dd>
  <dt><strong>privateMetadataTextContains</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>As <spanx style="verb">metadataTextContains</spanx>, but searches the authenticated user's <spanx style="verb">privateMetadata</spanx>.</t>
  </dd>
  <dt><strong>metadataTextEquals</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>Matches an object if the <spanx style="verb">metadata</spanx> value at the supplied <spanx style="verb">path</spanx> is a string that is exactly equal to the supplied <spanx style="verb">value</spanx>, comparing Unicode code points without case folding or normalization. The condition does not match if the path does not exist within <spanx style="verb">metadata</spanx>, or if the value at the path is not a string.</t>
  </dd>
  <dt><strong>privateMetadataTextEquals</strong>: <spanx style="verb">MetadataTextMatch</spanx></dt>
  <dd>
    <t>As <spanx style="verb">metadataTextEquals</spanx>, but searches the authenticated user's <spanx style="verb">privateMetadata</spanx>.</t>
  </dd>
</dl>

<t>The following availability rules apply to all six conditions:</t>

<t><list style="symbols">
  <t>Servers <bcp14>MUST</bcp14> support <spanx style="verb">metadataExists</spanx> and <spanx style="verb">privateMetadataExists</spanx> (where <spanx style="verb">supportsPrivate</spanx> is true).</t>
  <t>Servers <bcp14>MAY</bcp14> reject any of the four text-match conditions with an "unsupportedFilter" error if implementation cost or storage layout makes them infeasible. Clients need to be prepared to fall back to a client-side scan in this case.</t>
  <t>Any <spanx style="verb">privateMetadata*</spanx> condition (existence or text) <bcp14>MUST</bcp14> be rejected with an "unsupportedFilter" error if <spanx style="verb">supportsPrivate</spanx> is false for the data type.</t>
  <t>Conditions are evaluated against the stored data whether or not the namespace is supported on the data type, so data stored under an unsupported namespace (<xref target="namespace-removal"></xref>) can still be found. A condition naming an unsupported namespace with no stored data, or a string that is not a valid namespace identifier, matches no objects; it does not produce an error.</t>
</list></t>

<t>These conditions compose with the data type's existing filter conditions through the usual <spanx style="verb">AND</spanx>/<spanx style="verb">OR</spanx>/<spanx style="verb">NOT</spanx> operators (<xref section="5.5" sectionFormat="of" target="RFC8620"/>). For example, a client may query for Email objects in a particular mailbox whose vendor metadata contains a search term in a single server-side query, as shown in <xref target="example-query"></xref>.</t>

</section>
</section>
<section anchor="access-control"><name>Access Control</name>

<t>Access control for metadata follows the access control of the related object. The two properties are governed by different rules:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">metadata</spanx> property is shared. A user who can read the related object can read its <spanx style="verb">metadata</spanx>. Modifying it requires the <spanx style="verb">maySetMetadata</spanx> right (<xref target="maysetmetadata"></xref>).</t>
  <t>The <spanx style="verb">privateMetadata</spanx> property is per-user. The server <bcp14>MUST</bcp14> filter responses so that each user sees only the <spanx style="verb">privateMetadata</spanx> content they themselves wrote. Private metadata written by another user on the same related object <bcp14>MUST NOT</bcp14> be visible. To write <spanx style="verb">privateMetadata</spanx> on a related object, the user needs only read access to the related object; write access on the related object is not required.</t>
</list></t>

<section anchor="maysetmetadata"><name>The maySetMetadata Right</name>

<t>For every data type that has a <spanx style="verb">myRights</spanx> property (for example Mailbox <xref target="RFC8621"/>, Calendar <xref target="I-D.ietf-jmap-calendars"/>, AddressBook <xref target="RFC9610"/> and FileNode <xref target="I-D.ietf-jmap-filenode"/>) and that is a listed data type or contains objects of a listed data type, the rights object gains the following property:</t>

<dl newline="true">
  <dt><strong>maySetMetadata</strong>: <spanx style="verb">Boolean</spanx></dt>
  <dd>
    <t>The user may modify the shared <spanx style="verb">metadata</spanx> of this object, and of the objects it contains that have no rights object of their own. For Mailbox, this corresponds to the IMAP ACL "n" right <xref target="RFC5257"/>.</t>
  </dd>
</dl>

<t>The right is returned in <spanx style="verb">myRights</spanx> and can be granted through <spanx style="verb">shareWith</spanx> (<xref target="RFC9670"/>) like any other right of that type.</t>

<t>An object without a rights object of its own, such as an Email, CalendarEvent or ContactCard, takes the right from its containers. Modifying its <spanx style="verb">metadata</spanx> requires <spanx style="verb">maySetMetadata</spanx> on every container it belongs to; when the same update changes its containers, on every container both before and after the change; and on create, on the containers given in the create. For a listed data type that neither has a rights object nor belongs to a container that has one, such as SieveScript <xref target="RFC9661"/>, modifying <spanx style="verb">metadata</spanx> requires that the account is not read-only (<spanx style="verb">isReadOnly</spanx> is false, <xref section="2" sectionFormat="of" target="RFC8620"/>).</t>

<t>The server <bcp14>MUST</bcp14> enforce these rules consistently across <spanx style="verb">/get</spanx>, <spanx style="verb">/set</spanx>, <spanx style="verb">/query</spanx>, <spanx style="verb">/queryChanges</spanx>, and <spanx style="verb">/changes</spanx>. An object the user cannot read is treated for <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> exactly as for its other properties (for example, it is reported in <spanx style="verb">notFound</spanx>). A write to an object the user cannot read <bcp14>MUST</bcp14> be rejected with a "notFound" SetError, so that the existence of the object is not revealed. A write to <spanx style="verb">metadata</spanx> without <spanx style="verb">maySetMetadata</spanx> <bcp14>MUST</bcp14> be rejected with a "forbidden" SetError.</t>

<t>When sharing permissions on a related object change, the visibility of its <spanx style="verb">metadata</spanx> changes accordingly. <spanx style="verb">privateMetadata</spanx> belonging to a user remains visible to that user as long as the user retains read access to the related object. If read access is revoked, the object, including the user's <spanx style="verb">privateMetadata</spanx>, becomes inaccessible to that user; the server <bcp14>MAY</bcp14> delete that <spanx style="verb">privateMetadata</spanx>, and if it does not and access is restored, it is visible again. A user's <spanx style="verb">privateMetadata</spanx> is destroyed together with the related object.</t>

</section>
<section anchor="account-delegation-and-administrative-access"><name>Account Delegation and Administrative Access</name>

<t><spanx style="verb">privateMetadata</spanx> is keyed by the authenticated identity of the session. A delegate, an impersonating administrator, or any other session authenticated as a different identity than the account owner <bcp14>MUST</bcp14> see and write only its own <spanx style="verb">privateMetadata</spanx>, never the account owner's. Exposing the account owner's <spanx style="verb">privateMetadata</spanx> to such a session is outside the scope of this document.</t>

</section>
</section>
<section anchor="quota"><name>Quota</name>

<t>Servers <bcp14>SHOULD</bcp14> enforce quota limits on the storage consumed by metadata within an account. Unbounded metadata growth could be exploited to exhaust resources, particularly because <spanx style="verb">privateMetadata</spanx> is per-user and so a single shared object can carry one private payload per user with access to it.</t>

<t>Servers that support the JMAP Quotas extension <xref target="RFC9425"/> <bcp14>SHOULD</bcp14> integrate metadata storage into the quota framework defined there. Servers that do not implement <xref target="RFC9425"/> <bcp14>SHOULD</bcp14> still enforce implementation-defined limits and reject overruns with an "overQuota" SetError.</t>

<t>The size metric used for metadata quota is implementation-defined; clients cannot assume that two servers compute identical sizes for the same data. Servers can document the metric they use.</t>

<t>A server that also exposes the related object over other protocols (for example, as WebDAV dead properties <xref target="RFC4918"/> or IMAP METADATA <xref target="RFC5464"/>) <bcp14>MAY</bcp14> count data that is not visible through JMAP against the quota and limits described in this section. Clients therefore need to be prepared for a limit error on an object whose visible metadata is small.</t>

</section>
<section anchor="examples"><name>Examples</name>

<section anchor="example-capability"><name>Capability</name>

<t>A session for an account whose server supports metadata on four data types, with varying private-metadata and depth settings:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "capabilities": {
    "urn:ietf:params:jmap:metadata": {}
  },
  "accounts": {
    "A1": {
      "accountCapabilities": {
        "urn:ietf:params:jmap:metadata": {
          "dataTypes": {
            "Email": {
              "namespaces": [],
              "supportsVendorNamespaces": true,
              "supportsPrivate": true,
              "maxDepth": 4
            },
            "Mailbox": {
              "namespaces": [],
              "supportsVendorNamespaces": true,
              "supportsPrivate": true,
              "maxDepth": null
            },
            "CalendarEvent": {
              "namespaces": [],
              "supportsVendorNamespaces": true,
              "supportsPrivate": false,
              "maxDepth": 2
            },
            "FileNode": {
              "namespaces": ["photography"],
              "supportsVendorNamespaces": false,
              "supportsPrivate": false,
              "maxDepth": 3
            }
          }
        }
      }
    }
  }
}
]]></sourcecode></figure>

</section>
<section anchor="fetching-a-mailbox-with-its-metadata"><name>Fetching a Mailbox with Its Metadata</name>

<t>Request the shared metadata and the user's private metadata for a single Mailbox:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/get", {
    "accountId": "A1",
    "ids": ["MB1"],
    "properties": [
      "id", "name",
      "metadata/acme.example.com",
      "privateMetadata/acme.example.com"
    ]
  }, "c1"]
]
]]></sourcecode></figure>

<t>Response:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/get", {
    "accountId": "A1",
    "state": "mb-100",
    "list": [
      {
        "id": "MB1",
        "name": "Team Inbox",
        "metadata": {
          "acme.example.com": {
            "color": "blue",
            "owner": "team-alpha"
          }
        },
        "privateMetadata": {
          "acme.example.com": {
            "workflowState": "pending-review"
          }
        }
      }
    ],
    "notFound": []
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="patching-a-single-property-within-a-namespace"><name>Patching a Single Property within a Namespace</name>

<t>Update one property inside a namespace without disturbing the others:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/set", {
    "accountId": "A1",
    "update": {
      "MB1": {
        "metadata/acme.example.com/color": "green"
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>Removing a single property uses a patch to <spanx style="verb">null</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/set", {
    "accountId": "A1",
    "update": {
      "MB1": {
        "metadata/acme.example.com/color": null
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="creating-an-email-with-private-metadata"><name>Creating an Email with Private Metadata</name>

<t>Create a draft Email and attach a private workflow annotation atomically. The metadata is just another property on the create:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Email/set", {
    "accountId": "A1",
    "create": {
      "draft1": {
        "mailboxIds": { "MB1": true },
        "keywords": { "$draft": true },
        "subject": "Project Update",
        "from": [{ "email": "alice@example.com" }],
        "to":   [{ "email": "bob@example.com" }],
        "bodyStructure": {
          "type": "text/plain",
          "partId": "1"
        },
        "bodyValues": {
          "1": { "value": "Here is the project update..." }
        },
        "privateMetadata": {
          "acme.example.com": {
            "workflowState": "pending-review",
            "assignedTo": "carol@example.com"
          }
        }
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>The response is a single <spanx style="verb">Email/set</spanx> response; there is no separate metadata response, because metadata is part of the Email object.</t>

</section>
<section anchor="attaching-photography-metadata-to-a-filenode"><name>Attaching Photography Metadata to a FileNode</name>

<t>This example uses a <em>fictional</em> IANA-registered namespace <spanx style="verb">photography</spanx>, assumed for the purpose of this example to be specified for photographic information about image files and applicable to the <spanx style="verb">FileNode</spanx> data type. The capability for the account in <xref target="example-capability"></xref> advertises FileNode as supporting <spanx style="verb">photography</spanx> and no vendor namespaces.</t>

<t>Request:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["FileNode/set", {
    "accountId": "A1",
    "update": {
      "F456": {
        "metadata/photography": {
          "geoLocation": {
            "latitude": 46.362,
            "longitude": 14.090
          },
          "cameraMake": "Canon",
          "cameraModel": "EOS R5",
          "aperture": "f/2.8",
          "shutterSpeed": "1/250",
          "iso": 400,
          "focalLength": "50mm",
          "dateTaken": "2023-10-01T01:14:00Z",
          "imageSize": {
            "width": 6000,
            "height": 4000
          }
        }
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>Subsequent retrieval of the FileNode, requesting only the relevant metadata namespace:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["FileNode/get", {
    "accountId": "A1",
    "ids": ["F456"],
    "properties": [
      "id", "name", "type", "size",
      "metadata/photography"
    ]
  }, "c2"]
]
]]></sourcecode></figure>

<t>Response:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["FileNode/get", {
    "accountId": "A1",
    "state": "f-200",
    "list": [
      {
        "id": "F456",
        "name": "lake-island.jpg",
        "type": "image/jpeg",
        "size": 2458624,
        "metadata": {
          "photography": {
            "geoLocation": {
              "latitude": 46.362,
              "longitude": 14.090
            },
            "cameraMake": "Canon",
            "cameraModel": "EOS R5",
            "aperture": "f/2.8",
            "shutterSpeed": "1/250",
            "iso": 400,
            "focalLength": "50mm",
            "dateTaken": "2023-10-01T01:14:00Z",
            "imageSize": {
              "width": 6000,
              "height": 4000
            }
          }
        }
      }
    ],
    "notFound": []
  }, "c2"]
]
]]></sourcecode></figure>

</section>
<section anchor="updating-a-calendarevent-and-its-metadata-atomically"><name>Updating a CalendarEvent and Its Metadata Atomically</name>

<t>This example updates a primary property of a CalendarEvent and two vendor metadata properties in the same <spanx style="verb">/set</spanx> call. As with any update entry, either all of these changes apply or none do.</t>

<t>Request:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["CalendarEvent/set", {
    "accountId": "A1",
    "update": {
      "CE789": {
        "title": "Quarterly Review Meeting",
        "start": "2024-12-15T14:00:00",
        "metadata/acme.example.com/lastModifiedReason":
            "Rescheduled per manager request",
        "metadata/acme.example.com/approvalStatus": "pending"
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>A successful response is a single <spanx style="verb">CalendarEvent/set</spanx> response; metadata changes do not produce a separate response because they are properties of the event itself:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["CalendarEvent/set", {
    "accountId": "A1",
    "oldState": "c-200",
    "newState": "c-201",
    "updated": {
      "CE789": null
    }
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="example-query"><name>Querying by Metadata and a Primary Property Together</name>

<t>Find all Email objects in a particular Mailbox whose private vendor <spanx style="verb">memo</spanx> contains the text "follow up":</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Email/query", {
    "accountId": "A1",
    "filter": {
      "operator": "AND",
      "conditions": [
        { "inMailbox": "MB-inbox" },
        {
          "privateMetadataTextContains": {
            "path":  "acme.example.com/memo",
            "value": "follow up"
          }
        }
      ]
    }
  }, "c1"]
]
]]></sourcecode></figure>

</section>
<section anchor="detecting-a-metadata-only-change-through-changes"><name>Detecting a Metadata-Only Change through /changes</name>

<t>After another client updates the shared metadata of two Emails, the next <spanx style="verb">Email/changes</spanx> call returns:</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Email/changes", {
    "accountId": "A1",
    "oldState": "e-100",
    "newState": "e-103",
    "hasMoreChanges": false,
    "created": [],
    "updated": ["EM1", "EM2"],
    "destroyed": [],
    "updatedProperties": ["metadata"]
  }, "c1"]
]
]]></sourcecode></figure>

<t>The client knows it only needs to refetch the <spanx style="verb">metadata</spanx> property of <spanx style="verb">EM1</spanx> and <spanx style="verb">EM2</spanx>, not the full Email objects.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="metadata-confidentiality"><name>Metadata Confidentiality</name>

<t>Metadata may contain sensitive information: personal notes, workflow states, application-specific data, and other user-generated content. Servers <bcp14>MUST</bcp14> enforce the access-control rules in <xref target="access-control"></xref>. Failures here are direct privacy breaches.</t>

<t><spanx style="verb">privateMetadata</spanx> is per-user. The server <bcp14>MUST</bcp14> ensure that each user sees only their own content, even on shared related objects. This is the most common implementation pitfall in this specification: a query or <spanx style="verb">/get</spanx> implementation that returns another user's <spanx style="verb">privateMetadata</spanx> is a serious bug. Servers <bcp14>MUST</bcp14> verify that result filtering applies uniformly to <spanx style="verb">/get</spanx>, <spanx style="verb">/query</spanx>, <spanx style="verb">/changes</spanx>, <spanx style="verb">/queryChanges</spanx>, and to any cached or denormalized representation.</t>

<t>A server that advances the related type's state for user B in response to user A's private write (<xref target="state-behavior"></xref>) does not reveal the metadata content, but it does reveal that something private changed in the account, and when. Such a server also wakes up every client of every user sharing the data. Keeping state per viewer avoids both.</t>

</section>
<section anchor="user-identity-and-authentication"><name>User Identity and Authentication</name>

<t>The private-metadata model relies on accurate user identification. Servers need to identify the authenticated user reliably for every metadata operation and keep each <spanx style="verb">privateMetadata</spanx> value associated with the user that wrote it, so that identity spoofing or authentication bypass cannot expose another user's private metadata. Delegated and administrative sessions are covered in <xref target="account-delegation-and-administrative-access"></xref>.</t>

</section>
<section anchor="untrusted-namespace-values"><name>Untrusted Namespace Values</name>

<t>Namespace values are arbitrary client-supplied content. Servers and clients need to treat them as untrusted input: validate them before use, apply context-appropriate output encoding (for example, when rendering them in a web page or storing them in a database), and never interpret them as code. Servers store namespace values as given; they do not alter them, since clients and <spanx style="verb">metadataTextEquals</spanx> rely on exact values.</t>

<t>Clients that render metadata need appropriate sandboxing and Content Security Policy, and need to distinguish clearly in their user interface between <spanx style="verb">metadata</spanx> (visible to others) and <spanx style="verb">privateMetadata</spanx> (visible only to the user), so that users do not inadvertently disclose private notes. Clients also cannot assume the structure of a namespace value without checking it.</t>

</section>
<section anchor="resource-exhaustion"><name>Resource Exhaustion</name>

<t>Without controls, metadata can be abused for denial of service:</t>

<t><list style="symbols">
  <t>Storage exhaustion: bulk creation of large metadata payloads, particularly under <spanx style="verb">privateMetadata</spanx>, where every user with access to a shared object can independently consume space.</t>
  <t>Processing exhaustion: deeply nested or pathologically large namespace values.</t>
  <t>Query complexity: text-match filter conditions (<spanx style="verb">metadataTextContains</spanx>/<spanx style="verb">metadataTextEquals</spanx> and their private variants) that require expensive scanning, particularly when combined with per-user filtering across many users. Servers <bcp14>MAY</bcp14> reject such conditions with "unsupportedFilter" (<xref target="filter-conditions"></xref>) to bound the cost.</t>
</list></t>

<t>Servers <bcp14>SHOULD</bcp14> apply the quota mechanism in <xref target="quota"></xref>, and can also bound value sizes, enforce <spanx style="verb">maxDepth</spanx>, time out long-running queries, rate-limit metadata writes, and monitor for unusual usage patterns (for example, a single user creating private metadata on unusually many objects). Per-user filtering of <spanx style="verb">privateMetadata</spanx> needs to be efficient so that it does not itself become a denial-of-service vector.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="jmap-capability-registration-for-metadata"><name>JMAP Capability Registration for "metadata"</name>

<t>IANA will register the "metadata" JMAP Capability as follows:</t>

<t><strong>Capability Name:</strong> urn:ietf:params:jmap:metadata<br />
<strong>Specification document:</strong> this document<br />
<strong>Intended use:</strong> common<br />
<strong>Change Controller:</strong> IETF<br />
<strong>Security and privacy considerations:</strong> this document, <xref target="security-considerations"></xref></t>

</section>
<section anchor="namespaces-registry"><name>Creation of the "JMAP Metadata Namespaces" Registry</name>

<t>IANA is requested to create the "JMAP Metadata Namespaces" registry to record metadata namespace identifiers used as top-level keys in the <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx> properties defined by this specification.</t>

<t>This registry uses the Expert Review process (<xref section="4.5" sectionFormat="of" target="RFC8126"/>). Registrants must propose a name without a dot ("."), since names containing a dot are reserved for vendor domain-name namespaces and need no registration. The designated expert <bcp14>MUST</bcp14> ensure that the proposed name does not collide with an existing registration and that the specification provides sufficient detail for interoperability (in particular, the structure of the namespace's value).</t>

<t>Registrations may be of Intended Use "common", "reserved", or "obsolete". A "reserved" registration reserves a name without assigning semantics; an "obsolete" registration marks a name that should no longer be used by up-to-date implementations.</t>

<section anchor="preliminary-community-review"><name>Preliminary Community Review</name>

<t>Notice of a potential new registration <bcp14>SHOULD</bcp14> be sent to the JMAP mailing list <eref target="mailto:jmap@ietf.org">jmap@ietf.org</eref> for review. The intent is to solicit comments on the namespace identifier, the clarity of the specification, and any interoperability or security considerations. The submitter <bcp14>MAY</bcp14> revise or withdraw the proposal at any time.</t>

</section>
<section anchor="change-procedures"><name>Change Procedures</name>

<t>The change controller for a registration <bcp14>MAY</bcp14> request changes to its definition using the same procedure as the original registration. Significant changes that would invalidate existing data <bcp14>SHOULD</bcp14> be made only to correct serious errors. Registrations <bcp14>MUST NOT</bcp14> be deleted; namespaces that are no longer appropriate for use can be marked obsolete by a change to their intended-use field.</t>

<t>The change controller of a registration <bcp14>MAY</bcp14> transfer responsibility to another person or agency by informing IANA.</t>

</section>
<section anchor="jmap-metadata-namespaces-registry-template"><name>"JMAP Metadata Namespaces" Registry Template</name>

<dl newline="true">
  <dt><strong>Namespace Identifier</strong>:</dt>
  <dd>
    <t>The name registered for use as a key in the <spanx style="verb">metadata</spanx> or <spanx style="verb">privateMetadata</spanx> object. <bcp14>MUST</bcp14> consist of lowercase US-ASCII letters, digits, hyphens, and underscores, and <bcp14>MUST NOT</bcp14> contain a dot.</t>
  </dd>
  <dt><strong>Value Type</strong>:</dt>
  <dd>
    <t>A description of the structure of values stored under this namespace key (for example, "object whose values are strings").</t>
  </dd>
  <dt><strong>Applicable Properties</strong>:</dt>
  <dd>
    <t>One of: <spanx style="verb">"metadata"</spanx> (this namespace may appear only under <spanx style="verb">metadata</spanx>), <spanx style="verb">"privateMetadata"</spanx> (only under <spanx style="verb">privateMetadata</spanx>), or <spanx style="verb">"both"</spanx> (under either).</t>
  </dd>
  <dt><strong>Applicable Data Types</strong>:</dt>
  <dd>
    <t>A list of JMAP data type names on which this namespace is meaningful, or <spanx style="verb">"any"</spanx> if the namespace is not restricted.</t>
  </dd>
  <dt><strong>Reference or Description</strong>:</dt>
  <dd>
    <t>A brief description, or an RFC number and section reference, describing the namespace's contents. May be omitted for "reserved" entries.</t>
  </dd>
  <dt><strong>Intended Use</strong>:</dt>
  <dd>
    <t><spanx style="verb">"common"</spanx>, <spanx style="verb">"reserved"</spanx>, or <spanx style="verb">"obsolete"</spanx>.</t>
  </dd>
  <dt><strong>Change Controller</strong>:</dt>
  <dd>
    <t>Who may request changes to this entry (IETF for RFCs from the IETF stream).</t>
  </dd>
</dl>

</section>
<section anchor="submit-request-to-iana"><name>Submit Request to IANA</name>

<t>Registration requests can be sent to <eref target="mailto:iana@iana.org">iana@iana.org</eref>.</t>

</section>
<section anchor="designated-expert-review"><name>Designated Expert Review</name>

<t>The designated expert (DE) is primarily concerned with preventing name collisions and ensuring that the specification provides enough detail for interoperability. For common-use registrations, the DE is expected to confirm that suitable documentation (per <xref section="4.6" sectionFormat="of" target="RFC8126"/>) is available. A published specification is not required for reserved or obsolete registrations.</t>

<t>The DE will either approve or deny the registration and publish a notice of the decision to the JMAP working group mailing list (or its successor) and to IANA. A denial <bcp14>MUST</bcp14> be justified and <bcp14>SHOULD</bcp14> include concrete suggestions for how the request can be modified to become acceptable.</t>

</section>
<section anchor="initial-contents"><name>Initial Contents</name>

<t>This document defines no initial entries for the "JMAP Metadata Namespaces" registry. Future specifications may register entries through the procedure defined in this section.</t>

</section>
</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="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>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="RFC8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</reference>
<reference anchor="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>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>
<reference anchor="RFC6901">
  <front>
    <title>JavaScript Object Notation (JSON) Pointer</title>
    <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
    <author fullname="K. Zyp" initials="K." surname="Zyp"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <date month="April" year="2013"/>
    <abstract>
      <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6901"/>
  <seriesInfo name="DOI" value="10.17487/RFC6901"/>
</reference>
<reference anchor="RFC5051">
  <front>
    <title>i;unicode-casemap - Simple Unicode Collation Algorithm</title>
    <author fullname="M. Crispin" initials="M." surname="Crispin"/>
    <date month="October" year="2007"/>
    <abstract>
      <t>This document describes "i;unicode-casemap", a simple case-insensitive collation for Unicode strings. It provides equality, substring, and ordering operations. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5051"/>
  <seriesInfo name="DOI" value="10.17487/RFC5051"/>
</reference>
<reference anchor="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>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="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>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>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC8621">
  <front>
    <title>The JSON Meta Application Protocol (JMAP) for Mail</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="August" year="2019"/>
    <abstract>
      <t>This document specifies a data model for synchronising email data with a server using the JSON Meta Application Protocol (JMAP). Clients can use this to efficiently search, access, organise, and send messages, and to get push notifications for fast resynchronisation when new messages are delivered or a change is made in another client.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8621"/>
  <seriesInfo name="DOI" value="10.17487/RFC8621"/>
</reference>
<reference anchor="RFC9661">
  <front>
    <title>The JSON Meta Application Protocol (JMAP) for Sieve Scripts</title>
    <author fullname="K. Murchison" initials="K." surname="Murchison"/>
    <date month="September" year="2024"/>
    <abstract>
      <t>This document specifies a data model for managing Sieve scripts on a server using the JSON Meta Application Protocol (JMAP). Clients can use this protocol to efficiently search, access, organize, and validate Sieve scripts.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9661"/>
  <seriesInfo name="DOI" value="10.17487/RFC9661"/>
</reference>
<reference anchor="RFC9610">
  <front>
    <title>JSON Meta Application Protocol (JMAP) for Contacts</title>
    <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
    <date month="December" year="2024"/>
    <abstract>
      <t>This document specifies a data model for synchronising contact data with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9610"/>
  <seriesInfo name="DOI" value="10.17487/RFC9610"/>
</reference>
<reference anchor="RFC5257">
  <front>
    <title>Internet Message Access Protocol - ANNOTATE Extension</title>
    <author fullname="C. Daboo" initials="C." surname="Daboo"/>
    <author fullname="R. Gellens" initials="R." surname="Gellens"/>
    <date month="June" year="2008"/>
    <abstract>
      <t>The ANNOTATE extension to the Internet Message Access Protocol permits clients and servers to maintain "meta data" for messages, or individual message parts, stored in a mailbox on the server. For example, this can be used to attach comments and other useful information to a message. It is also possible to attach annotations to specific parts of a message, so that, for example, they could be marked as seen, or important, or a comment added.</t>
      <t>Note that this document was the product of a WG that had good consensus on how to approach the problem. Nevertheless, the WG felt it did not have enough information on implementation and deployment hurdles to meet all of the requirements of a Proposed Standard. The IETF solicits implementations and implementation reports in order to make further progress.</t>
      <t>Implementers should be aware that this specification may change in an incompatible manner when going to Proposed Standard status. However, any incompatible changes will result in a new capability name being used to prevent problems with any deployments of the experimental extension. This memo defines an Experimental Protocol for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5257"/>
  <seriesInfo name="DOI" value="10.17487/RFC5257"/>
</reference>

<reference anchor="I-D.ietf-jmap-calendars">
   <front>
      <title>JSON Meta Application Protocol (JMAP) for Calendars</title>
      <author fullname="Neil Jenkins" initials="N." surname="Jenkins">
         <organization>Fastmail</organization>
      </author>
      <author fullname="Michael Douglass" initials="M." surname="Douglass">
         <organization>Spherical Cow Group</organization>
      </author>
      <date day="13" month="October" year="2026"/>
      <abstract>
	 <t>   This document specifies a data model for synchronizing calendar data
   with a server using JMAP.  Clients can use this to efficiently read,
   write, and share calendars and events, receive push notifications for
   changes or event reminders, and keep track of changes made by others
   in a multi-user environment.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-calendars-33"/>
   
</reference>

<reference anchor="I-D.ietf-jmap-filenode">
   <front>
      <title>JMAP File Storage extension</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="18" month="October" year="2026"/>
      <abstract>
	 <t>   The JMAP base protocol (RFC8620) provides the ability to upload and
   download arbitrary binary data.  This binary data is called a &quot;blob&quot;,
   and can be used in all other JMAP extensions.

   This extension adds a method to expose blobs as a filesystem along
   with the types of metadata that are provided by other remote
   filesystem protocols.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-filenode-17"/>
   
</reference>
<reference anchor="RFC9425">
  <front>
    <title>JSON Meta Application Protocol (JMAP) for Quotas</title>
    <author fullname="R. Cordier" initials="R." role="editor" surname="Cordier"/>
    <date month="June" year="2023"/>
    <abstract>
      <t>This document specifies a data model for handling quotas on accounts with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9425"/>
  <seriesInfo name="DOI" value="10.17487/RFC9425"/>
</reference>
<reference anchor="RFC5464">
  <front>
    <title>The IMAP METADATA Extension</title>
    <author fullname="C. Daboo" initials="C." surname="Daboo"/>
    <date month="February" year="2009"/>
    <abstract>
      <t>The METADATA extension to the Internet Message Access Protocol permits clients and servers to maintain "annotations" or "metadata" on IMAP servers. It is possible to have annotations on a per-mailbox basis or on the server as a whole. For example, this would allow comments about the purpose of a particular mailbox to be "attached" to that mailbox, or a "message of the day" containing server status information to be made available to anyone logging in to the server. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5464"/>
  <seriesInfo name="DOI" value="10.17487/RFC5464"/>
</reference>
<reference anchor="RFC4918">
  <front>
    <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
    <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault"/>
    <date month="June" year="2007"/>
    <abstract>
      <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
      <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4918"/>
  <seriesInfo name="DOI" value="10.17487/RFC4918"/>
</reference>



    </references>

</references>


<?line 769?>

<section anchor="changes"><name>Changes</name>

<t>[[This section to be removed by RFC Editor]]</t>

<t><strong>draft-ietf-jmap-metadata-04</strong></t>

<t><list style="symbols">
  <t>Replaced the mapping of metadata write access onto existing rights with a new <spanx style="verb">maySetMetadata</spanx> right.</t>
  <t>Relaxed the per-viewer state requirement for private writes to <bcp14>SHOULD NOT</bcp14>, while still forbidding other users' <spanx style="verb">/changes</spanx> and <spanx style="verb">/queryChanges</spanx> from reporting the object.</t>
</list></t>

<t><strong>draft-ietf-jmap-metadata-03</strong></t>

<t><list style="symbols">
  <t>Clarified that metadata-only changes do not update server-maintained modification timestamps.</t>
  <t>Defined behavior for requests that do not use the capability.</t>
  <t>Allowed patch paths at any depth, and placed "invalidPatch" in the <spanx style="verb">/set</spanx> validation order.</t>
  <t>Defined the interaction of <spanx style="verb">updatedProperties</spanx> and <spanx style="verb">ignoreMetadataOnlyChanges</spanx> with the Mailbox count properties.</t>
  <t>Added <spanx style="verb">/copy</spanx> behavior; excluded <spanx style="verb">/import</spanx> and <spanx style="verb">/parse</spanx> style methods.</t>
  <t>Excluded metadata from the <spanx style="verb">Email/get</spanx> default property list.</t>
  <t>Specified the "i;unicode-casemap" collation for <spanx style="verb">metadataTextContains</spanx>.</t>
  <t>Required lowercase domain-name namespace identifiers.</t>
  <t>Defined read and write rights for the data types of JMAP Mail, Calendars, Contacts, FileNode and Sieve, and the rule for objects in several containers.</t>
  <t>Clarified handling of data in unsupported namespaces in subselectors, filters, complete replacements and copies.</t>
  <t>Allowed filter condition paths at any depth below a namespace.</t>
  <t>Added terminology, defined depth recursively, and made editorial clarifications throughout.</t>
  <t>Recommended omitting the capability when no data type is listed, and noted that limits may count data from other protocols.</t>
</list></t>

<t><strong>draft-ietf-jmap-metadata-02</strong></t>

<t><list style="symbols">
  <t>Redesigned the extension around two properties (<spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>) on each opted-in JMAP data type, rather than a separate <spanx style="verb">Metadata</spanx> data type with its own methods. Removed the <spanx style="verb">Metadata</spanx> data type, all <spanx style="verb">Metadata/*</spanx> methods, the related object types, the extended <spanx style="verb">/get</spanx>/<spanx style="verb">/set</spanx> arguments, and the uniqueness and cascading-deletion machinery.</t>
  <t>Added a per-data-type capability advertising IANA-registered namespace support (<spanx style="verb">namespaces</spanx>), vendor (domain-name) namespace support (<spanx style="verb">supportsVendorNamespaces</spanx>), private-metadata support (<spanx style="verb">supportsPrivate</spanx>), and a nesting limit (<spanx style="verb">maxDepth</spanx>).</t>
  <t>Added <spanx style="verb">updatedProperties</spanx> to <spanx style="verb">Foo/changes</spanx> for opted-in types, modelled on <spanx style="verb">Mailbox/changes</spanx> in RFC 8621. Specified per-viewer behavior for <spanx style="verb">/changes</spanx> and <spanx style="verb">/queryChanges</spanx> on shared objects carrying per-user private metadata.</t>
  <t>Added FilterCondition fields to <spanx style="verb">Foo/query</spanx>: <spanx style="verb">metadataExists</spanx>, <spanx style="verb">privateMetadataExists</spanx>, <spanx style="verb">metadataTextContains</spanx>, <spanx style="verb">metadataTextEquals</spanx>, and the corresponding private variants. Servers <bcp14>MAY</bcp14> reject the text-match conditions with "unsupportedFilter" when implementation cost is prohibitive.</t>
  <t>Added an <spanx style="verb">ignoreMetadataOnlyChanges</spanx> argument to <spanx style="verb">Foo/changes</spanx>, letting metadata-uninterested clients skip wakeups for metadata-only changes on data types they otherwise care about.</t>
  <t>Specified PatchObject semantics for <spanx style="verb">metadata</spanx> and <spanx style="verb">privateMetadata</spanx>, including handling of unknown namespaces, error ordering on <spanx style="verb">/set</spanx>, and the migration case where a namespace is removed from the server's advertised set after data has been written.</t>
  <t>Replaced the previous metadata-types and metadata-properties registries with a single "JMAP Metadata Namespaces" registry. This document defines no initial entries; bindings to other protocols (e.g., IMAP METADATA, WebDAV dead properties) are expected to be defined in separate specifications.</t>
</list></t>

<t><strong>draft-ietf-jmap-metadata-01</strong></t>

<t><list style="symbols">
  <t>Renamed <spanx style="verb">parentType</spanx> and <spanx style="verb">parentId</spanx> properties to <spanx style="verb">relatedType</spanx> and <spanx style="verb">relatedId</spanx> throughout the document to better reflect their purpose and avoid implying a strict hierarchy.</t>
  <t>Added <spanx style="verb">filterRelatedType</spanx> and <spanx style="verb">filterMetadataType</spanx> optional parameters to Metadata/changes method to allow filtering changes by related object type and metadata type.</t>
  <t>Changed the error type from "invalidProperties" to "alreadyExists" when a client attempts to create a Metadata object that violates the uniqueness constraint.</t>
  <t>Added requirement that <spanx style="verb">relatedType</spanx> must be specified in the same FilterCondition object whenever <spanx style="verb">relatedIds</spanx> is used in Metadata/query.</t>
  <t>Added <spanx style="verb">id</spanx> as a <bcp14>MUST</bcp14> support property for sorting in Metadata/query; other properties changed to <bcp14>SHOULD</bcp14> support.</t>
  <t>Replaced the <spanx style="verb">metadataTypes</spanx> argument with a <spanx style="verb">fetchMetadata</spanx> Boolean argument (default: false) in the extended /get method.</t>
  <t>Added <spanx style="verb">onSuccessCreateMetadata</spanx> and <spanx style="verb">onSuccessUpdateMetadata</spanx> arguments to the extended /set method to enable transactional metadata operations that are conditional on the success of the related object operation.</t>
</list></t>

<t><strong>draft-ietf-jmap-metadata-00</strong></t>

<t><list style="symbols">
  <t>Initial version</t>
</list></t>

</section>


  </back>

<!-- ##markdown-source:
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
bsrZhM0AAA==

-->

</rfc>

