<?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.32 (Ruby 3.3.0) -->


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

]>


<rfc ipr="trust200902" docName="draft-ietf-jmap-blobext-03" category="std" consensus="true" submissionType="IETF" obsoletes="9404" updates="8620" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP Blob">JMAP Blob Management</title>

    <author initials="B." surname="Gondwana" fullname="Bron Gondwana">
      <organization>Fastmail</organization>
      <address>
        <email>brong@fastmailteam.com</email>
      </address>
    </author>

    <date year="2026" month="November" day="02"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 40?>

<t>The JSON Meta Application Protocol (JMAP) base protocol (<xref target="JMAP-CORE"/>)
provides the ability to upload and download arbitrary binary data via HTTP
POST and GET on a defined endpoint.  This binary data is called a "blob".</t>

<t>This extension adds additional ways to create and access blobs by making
inline method calls within a standard JMAP request.  It also adds a reverse
lookup mechanism to discover where blobs are referenced within other data
types, support for large blobs via chunked construction with server-side
optimisation, and server-side blob conversion operations including image
format conversion, archive creation and extraction, compression and
decompression, and delta/patch operations.</t>



    </abstract>



  </front>

  <middle>


<?line 54?>

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

<t>Sometimes JMAP (<xref target="JMAP-CORE"/>) interactions require creating a blob and then
referencing it.  Embedding blobs directly into the JMAP method calls array
can reduce round trips.</t>

<t>Likewise, when fetching an object, it can be useful to also fetch the raw
content of that object without a separate round trip.</t>

<t>When JMAP is proxied through a system that applies additional access
restrictions, it can be useful to know which objects reference any particular
blob; this document defines a way to discover those references.</t>

<t>For large blobs, a client may wish to upload data in chunks and have the
server assemble them efficiently, or retrieve information about how the server
has stored a blob internally.</t>

<t>Many applications also benefit from server-side transformations — converting
images, creating or unpacking archives, compressing or decompressing data, or
computing and applying deltas — without needing to download and re-upload
blob content.</t>

<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</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?>

</section>
</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 target="JMAP-CORE"/>, Section 2.</t>

<t>This document defines one additional capability URI.</t>

<section anchor="urnietfparamsjmapblob2"><name>urn:ietf:params:jmap:blob2</name>

<t>The capability <spanx style="verb">urn:ietf:params:jmap:blob2</spanx> being present in the
"accountCapabilities" property of an account represents support for
the blob methods defined in this document: Blob/set, Blob/get,
Blob/lookup, and Blob/convert.  Servers that include this capability
in one or more "accountCapabilities" properties <bcp14>MUST</bcp14> also include it
in the "capabilities" property.</t>

<t>A server <bcp14>MAY</bcp14> also advertise <spanx style="verb">urn:ietf:params:jmap:blob</spanx> (as defined
in <xref target="JMAP-BLOB"/>) to support older clients, but a client <bcp14>MUST NOT</bcp14> include
both <spanx style="verb">urn:ietf:params:jmap:blob</spanx> and <spanx style="verb">urn:ietf:params:jmap:blob2</spanx>
in the <spanx style="verb">using</spanx> array of the same request.  The blob2 capability
supersedes the blob capability and does not depend on it.</t>

<t>The value of this property in the JMAP session "capabilities"
property <bcp14>MUST</bcp14> be an empty object.</t>

<t>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>

<t><list style="symbols">
  <t>maxSizeBlobSet: "UnsignedInt|null"  <vspace blankLines='1'/>
The maximum size of a blob (in octets) that the server will
  allow to be created (including blobs created by concatenating
  multiple data sources together).  A creation that would exceed
  it is rejected with a "tooLarge" SetError.  If null, the server
  does not advertise a specific limit but <bcp14>MAY</bcp14> still reject blobs
  that are too large.</t>
  <t>maxDataSources: "UnsignedInt"  <vspace blankLines='1'/>
The maximum number of DataSourceObjects allowed in the <spanx style="verb">data</spanx>
  array of a single creation in Blob/set.  Servers <bcp14>MUST</bcp14> support
  at least 64 DataSourceObjects per creation.  A creation with
  more is rejected with a "tooLarge" SetError.</t>
  <t>supportedTypeNames: "String[]"  <vspace blankLines='1'/>
An array of data type names that the server supports for
  Blob/lookup.  The values are the names listed in the IANA "JMAP
  Data Types" registry.  If the array is empty, the server does
  not support Blob/lookup.  Servers <bcp14>MAY</bcp14> include private type names
  not in the registry; clients <bcp14>MUST</bcp14> ignore names they do not
  recognise.  Clients <bcp14>MUST</bcp14> also ignore names that they do
  recognise if the corresponding capability for that type name
  is not present in the 'capabilities' section of the session
  object, because that means that the name has been used as a
  private type rather than a capability that the client knows.</t>
  <t>supportedDigestAlgorithms: "String[]"  <vspace blankLines='1'/>
An array of digest algorithms supported for Blob/get and for
  checking digests in Blob/set, from the IANA "Hash Algorithms for
  HTTP Digest Fields" registry <xref target="DIGEST-FIELDS"/>, expressed in
  lowercase (e.g., "sha-256", "sha").  <vspace blankLines='1'/>
The server lists the algorithms in its order of preference, and
  <bcp14>SHOULD</bcp14> only list ones it can compute efficiently: a server that
  stores a digest of each blob, for example, can return that one
  without reading the blob.  Clients <bcp14>SHOULD</bcp14> use the first algorithm
  in the list that they support.  An algorithm the registry marks
  as deprecated, such as "sha" (SHA-1), which <xref target="JMAP-BLOB"/> servers and
  clients commonly use, <bcp14>MAY</bcp14> still be listed.  SHA-1 is vulnerable to
  collision attacks: it detects accidental corruption, but a client
  relying on a digest to detect deliberate tampering <bcp14>SHOULD NOT</bcp14> use
  it.</t>
  <t>uploadUrl: "String|null"  <vspace blankLines='1'/>
A URI template (optionally containing <spanx style="verb">{accountId}</spanx>) for
  uploading blobs via HTTP POST for this account, in the same
  format as the session-level <spanx style="verb">uploadUrl</spanx> defined in
  <xref target="JMAP-CORE"/>, Section 2.  Servers <bcp14>MUST</bcp14> still provide the
  session-level <spanx style="verb">uploadUrl</spanx>; this per-account URL is an
  alternative that <bcp14>MAY</bcp14> point to a different server or be more
  efficient for this account.  Uploads to this URL return a JSON
  object with the same properties as the session-level upload
  response, plus an <spanx style="verb">expires</spanx> property as defined in "The expires
  Response Property" below.  If null, clients <bcp14>SHOULD</bcp14> use the
  session-level <spanx style="verb">uploadUrl</spanx>.</t>
  <t>chunkSize: "UnsignedInt|null"  <vspace blankLines='1'/>
A hint indicating the preferred chunk size in octets.  If a
  client uploads blobs with exactly this size except for the
  final chunk, and uses Blob/set with DataSourceObjects
  referencing these chunks, the server can optimise storage of
  these chunks.  Servers <bcp14>MUST</bcp14> allow other sizes for the
  individual data blocks in Blob/set though, and will then
  choose whether to store them as an array of blobs still, or
  to combine them.</t>
  <t>supportedImageReadTypes: "String[]|null"  <vspace blankLines='1'/>
The media types (<xref target="MEDIA-TYPES"/>) that the server can read as
  input to ImageConvertRecipe.  If null, the server does not
  support image conversion.</t>
  <t>supportedImageWriteTypes: "String[]|null"  <vspace blankLines='1'/>
The media types (<xref target="MEDIA-TYPES"/>) that the server can produce
  as output from ImageConvertRecipe.  If null, the server does
  not support image conversion.</t>
  <t>supportedArchiveTypes: "String[]|null"  <vspace blankLines='1'/>
The archive media types (<xref target="MEDIA-TYPES"/>) supported for creating
  archives via ArchiveRecipe.  If null, the server does not support
  archive creation.</t>
  <t>supportedExtractTypes: "String[]|null"  <vspace blankLines='1'/>
The archive media types supported for extracting archives via
  ExtractRecipe.  This <bcp14>MAY</bcp14> include types not in
  <spanx style="verb">supportedArchiveTypes</spanx> (e.g., "application/vnd.ms-tnef").
  If null, the server does not support archive extraction.</t>
  <t>supportedCompressTypes: "String[]|null"  <vspace blankLines='1'/>
The compression media types (<xref target="MEDIA-TYPES"/>) supported for
  compressing via CompressRecipe.  If null, the server does not
  support compression.</t>
  <t>supportedDecompressTypes: "String[]|null"  <vspace blankLines='1'/>
The compression media types supported for decompressing via
  DecompressRecipe.  This <bcp14>MAY</bcp14> include types not in
  <spanx style="verb">supportedCompressTypes</spanx>.  If null, the server does not
  support decompression.</t>
  <t>supportedDeltaTypes: "String[]|null"  <vspace blankLines='1'/>
The delta media types (<xref target="MEDIA-TYPES"/>) supported for computing
  deltas via DeltaRecipe.  If null, the server does not support
  delta computation.</t>
  <t>supportedPatchTypes: "String[]|null"  <vspace blankLines='1'/>
The delta media types supported for applying patches via
  PatchRecipe.  This <bcp14>MAY</bcp14> include types not in
  <spanx style="verb">supportedDeltaTypes</spanx>.  If null, the server does not
  support patch application.</t>
  <t>maxConvertSize: "UnsignedInt|null"  <vspace blankLines='1'/>
If supplied, the maximum size in octets of any single input
  blob to a Blob/convert operation.  Requests referencing a blob
  larger than this value <bcp14>MUST</bcp14> be rejected with a "tooLarge"
  SetError.  If null, the server does not advertise a specific
  limit but <bcp14>MAY</bcp14> still reject blobs that are too large.</t>
  <t>maxArchiveEntries: "UnsignedInt|null"  <vspace blankLines='1'/>
If supplied, the maximum number of entries allowed in an
  ArchiveRecipe.  Requests exceeding this limit <bcp14>MUST</bcp14> be rejected
  with a "tooLarge" SetError.  If null, the server does not
  advertise a specific limit but <bcp14>MAY</bcp14> still reject requests with
  too many entries.</t>
  <t>maxImageDimension: "UnsignedInt|null"  <vspace blankLines='1'/>
If supplied, the maximum value accepted for <spanx style="verb">width</spanx> or <spanx style="verb">height</spanx>
  in an ImageConvertRecipe, in pixels.  Requests exceeding this
  limit <bcp14>MUST</bcp14> be rejected with a "tooLarge" SetError.  If null,
  the server does not advertise a specific limit but <bcp14>MAY</bcp14> still
  reject requests with dimensions that are too large.</t>
</list></t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "urn:ietf:params:jmap:blob2": {
    "maxSizeBlobSet": 52428800,
    "maxDataSources": 64,
    "supportedTypeNames": ["Email", "Thread", "Mailbox"],
    "supportedDigestAlgorithms": ["sha-256", "sha"],
    "uploadUrl": "https://up.example.com/jmap/upload/{accountId}/",
    "chunkSize": 5242880,
    "supportedImageReadTypes": [
      "image/png",
      "image/jpeg",
      "image/gif",
      "image/tiff"
    ],
    "supportedImageWriteTypes": [
      "image/png",
      "image/jpeg"
    ],
    "supportedArchiveTypes": [
      "application/zip",
      "application/x-tar"
    ],
    "supportedExtractTypes": [
      "application/zip",
      "application/x-tar",
      "application/vnd.ms-tnef"
    ],
    "supportedCompressTypes": [
      "application/gzip",
      "application/zstd"
    ],
    "supportedDecompressTypes": [
      "application/gzip",
      "application/x-bzip2",
      "application/zstd"
    ],
    "supportedDeltaTypes": [
      "application/x-rdiff-delta",
      "text/x-diff"
    ],
    "supportedPatchTypes": [
      "application/x-rdiff-delta",
      "text/x-diff"
    ],
    "maxConvertSize": 104857600,
    "maxArchiveEntries": 10000,
    "maxImageDimension": 8192
  }
}
]]></sourcecode></figure>

</section>
</section>
</section>
<section anchor="datasourceobject"><name>DataSourceObject</name>

<t>A DataSourceObject describes a source of data for use in Blob/set.
It <bcp14>MUST</bcp14> contain exactly one of either <spanx style="verb">data:asText</spanx> or <spanx style="verb">data:asBase64</spanx>
(for inline data) or <spanx style="verb">blobId</spanx> (for a reference to an existing blob).
The <spanx style="verb">data:asText</spanx> and <spanx style="verb">data:asBase64</spanx> properties <bcp14>MUST NOT</bcp14> both be
present in the same DataSourceObject.</t>

<t><list style="symbols">
  <t>data:asText: "String|null"  <vspace blankLines='1'/>
The data represented as a UTF-8 string.</t>
  <t>data:asBase64: "String|null"  <vspace blankLines='1'/>
The data encoded as base64 (<xref target="BASE64"/>).</t>
  <t>blobId: "BlobId"  <vspace blankLines='1'/>
The blobId of an existing blob whose octets are to be copied
  into the new blob.</t>
  <t>offset: "UnsignedInt|null"  <vspace blankLines='1'/>
The offset (in octets) within the data source from which to
  start copying.  If null, defaults to 0 (the start of the data
  source).</t>
  <t>length: "UnsignedInt|null"  <vspace blankLines='1'/>
The number of octets to copy from the data source.  If null,
  copy from <spanx style="verb">offset</spanx> to the end of the data source.</t>
  <t>size: "UnsignedInt|null"  <vspace blankLines='1'/>
The full size of the data source in octets.  In the <spanx style="verb">chunks</spanx>
  array of a Blob/get response this is the size of the underlying
  chunk blob.</t>
  <t>position: "UnsignedInt|null"  <vspace blankLines='1'/>
The byte offset of the start of this data source within the
  outer (containing) blob.  Only meaningful in the <spanx style="verb">chunks</spanx> array
  of a Blob/get response.  This value is redundant with the sum of
  the <spanx style="verb">length</spanx> values of the preceding chunks, but it allows a
  client to locate the chunk covering a particular byte range
  without fetching or summing every earlier chunk, and when a
  DataSourceObject is reused in Blob/set it acts as a consistency
  check that the chunk is being placed where the client expects.</t>
</list></t>

<t>A DataSourceObject in the <spanx style="verb">chunks</spanx> array of a Blob/get response <bcp14>MAY</bcp14>
also include <spanx style="verb">digest:*</spanx> properties (e.g. <spanx style="verb">digest:sha-256</spanx>) when
those names are included in the <spanx style="verb">dataSourceProperties</spanx> request
argument.  Each digest value is computed over the octets that the
chunk contributes to the blob (i.e. after applying <spanx style="verb">offset</spanx> and
<spanx style="verb">length</spanx>).</t>

<t>When a server provides <spanx style="verb">size</spanx>, <spanx style="verb">position</spanx>, or <spanx style="verb">digest:*</spanx> values in
a Blob/get response, it <bcp14>MUST</bcp14> calculate them correctly.</t>

<t>A DataSourceObject used in Blob/set is invalid if <spanx style="verb">data:asText</spanx> is
not valid UTF-8, if <spanx style="verb">data:asBase64</spanx> is not valid base64, if the range
given by <spanx style="verb">offset</spanx> and <spanx style="verb">length</spanx> begins or extends past the end of the
data, or if any <spanx style="verb">size</spanx>, <spanx style="verb">position</spanx>, or <spanx style="verb">digest:*</spanx> value it contains
does not match the actual data.  The server <bcp14>MUST NOT</bcp14> guess the
user's intent: it <bcp14>MUST</bcp14> reject the creation with an
"invalidProperties" SetError whose <spanx style="verb">properties</spanx> is ["data"].  If
a <spanx style="verb">blobId</spanx> does not exist, or the user cannot access it, the server
<bcp14>MUST</bcp14> reject the creation with a "notFound" SetError.</t>

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

<t>Blob/set is defined under the <spanx style="verb">urn:ietf:params:jmap:blob2</spanx> capability
and requires that capability in the request's <spanx style="verb">using</spanx> array.</t>

<t>This method creates, touches, and destroys blobs.  It is a standard
Foo/set method (<xref target="JMAP-CORE"/>, Section 5.3) with the following
blob-specific behaviours:</t>

<t><list style="symbols">
  <t>Blobs have no state, as in <xref target="JMAP-BLOB"/>: Blob/get returns no
state string, and there is no Blob/changes method.  Blob/set does
not take an <spanx style="verb">ifInState</spanx> argument, and a non-null value is rejected
with an "invalidArguments" error.  Unlike other Foo/set methods,
the response has <spanx style="verb">oldState</spanx> and <spanx style="verb">newState</spanx> both null.</t>
  <t>create: "Id[BlobCreateObject]|null"  <vspace blankLines='1'/>
A map of a creation id to a BlobCreateObject describing the blob
  to create, or null if no blobs are to be created.</t>
  <t>update: A map of blobId to a patch object.  The only property a
client can request to change is <spanx style="verb">expires</spanx>; all other properties can
only be set to their existing values.  The server can honour the
requested <spanx style="verb">expires</spanx> (by not returning an <spanx style="verb">expires</spanx> in the updated
BlobObject) or return a different <spanx style="verb">expires</spanx> value if it applied a
different lifetime.  The purpose of update is to "touch" the blob,
refreshing its lifetime on the server.  If the blobId does not
exist, it <bcp14>MUST</bcp14> be reported in a <spanx style="verb">notUpdated</spanx> map with a "notFound"
SetError.</t>
  <t>destroy: The server <bcp14>MUST</bcp14> reject any blob that is still referenced
by another object with a "blobHasReference" SetError.</t>
</list></t>

<t>A BlobCreateObject has the following properties:</t>

<t><list style="symbols">
  <t>data: "DataSourceObject[]"  <vspace blankLines='1'/>
An array of zero or more DataSourceObjects.  The new blob is
  formed by concatenating the data described by each DataSourceObject
  in the order given.</t>
  <t>type: "String|null" (default: null)  <vspace blankLines='1'/>
A media type hint (<xref target="MEDIA-TYPES"/>) for the blob.  The server
  <bcp14>MAY</bcp14> use this when setting the Content-Type of a subsequent
  download of the blob, but is not required to.  The server <bcp14>MAY</bcp14>
  infer the type itself and override the client's hint.</t>
  <t>size: "UnsignedInt|null" (default: null)  <vspace blankLines='1'/>
The size in octets of the blob being created: the total of the
  octets contributed by all the DataSourceObjects.  If given, the
  server <bcp14>MUST</bcp14> reject the creation with an "invalidProperties"
  SetError if the resulting blob is a different size.</t>
  <t>digest:&lt;algorithm&gt;: "String|null" (default: null)  <vspace blankLines='1'/>
The base64-encoded digest of the whole blob being created,
  computed with the named algorithm, as returned by Blob/get.  A
  client <bcp14>MAY</bcp14> give any number of these.  The server <bcp14>MUST</bcp14> verify each
  one against the resulting blob, and if any does not match, <bcp14>MUST</bcp14>
  reject the creation with an "invalidProperties" SetError and <bcp14>MUST
  NOT</bcp14> create the blob.  A server <bcp14>MUST</bcp14> reject a digest whose
  algorithm is not in its <spanx style="verb">supportedDigestAlgorithms</spanx> capability
  with an "invalidProperties" SetError, so that a client never
  believes an unchecked blob was verified.  <vspace blankLines='1'/>
This lets a client that uploaded content in several pieces, or
  sent it inline, confirm in the same call that the server holds
  exactly the bytes it meant to send, without a further Blob/get.</t>
  <t>noPersist: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the resulting blob is ephemeral: it may be referenced
  via creation id backreferences within the same JMAP request,
  but the server is not required to persist it beyond the lifetime
  of the request.  The server <bcp14>MAY</bcp14> omit ephemeral blobs from the
  <spanx style="verb">created</spanx> map of the response and from the <spanx style="verb">createdIds</spanx> of the
  final Response object if it did not create a referenceable blob.
  This allows servers to optimise pipelines where intermediate
  blobs are never needed after the request completes.</t>
</list></t>

<t>Inline data (<spanx style="verb">data:asText</spanx> and <spanx style="verb">data:asBase64</spanx>) is part of the JMAP
request, so it counts towards the server's <spanx style="verb">maxSizeRequest</spanx> limit
(<xref target="JMAP-CORE"/>, Section 2), and base64 makes it about a third larger
than the octets it carries.  Clients <bcp14>SHOULD</bcp14> consider using the upload
endpoint (<xref target="JMAP-CORE"/>, Section 6.1) for blobs larger than a
megabyte, and referencing the uploaded blob by <spanx style="verb">blobId</spanx>.</t>

<t>Apart from <spanx style="verb">oldState</spanx> and <spanx style="verb">newState</spanx>, the response is a standard
Foo/set response.  The objects in the
<spanx style="verb">created</spanx> and <spanx style="verb">updated</spanx> maps are BlobObjects.  If an update set a
new <spanx style="verb">expires</spanx>, the server returns a BlobObject with the actual
<spanx style="verb">expires</spanx> that was applied; if the server accepted the requested
value it need not return an <spanx style="verb">expires</spanx> in the BlobObject.</t>

<t>A BlobObject has the following properties:</t>

<t><list style="symbols">
  <t>id: "BlobId"  <vspace blankLines='1'/>
The id of the blob.</t>
  <t>type: "String|null"  <vspace blankLines='1'/>
The media type of the blob, or null if unknown.</t>
  <t>size: "UnsignedInt|null"  <vspace blankLines='1'/>
The size of the blob in octets, or null if the server has not yet
  generated a Blob/convert result (see "Blob/convert").</t>
  <t>expires: "UTCDate|null"  <vspace blankLines='1'/>
See "The expires Response Property" below.</t>
</list></t>

</section>
<section anchor="blobget"><name>Blob/get</name>

<t>Blob/get is defined under the <spanx style="verb">urn:ietf:params:jmap:blob2</spanx> capability
and requires that capability in the request's <spanx style="verb">using</spanx> array.</t>

<t>This method retrieves blob data.  It is a standard Foo/get method
(<xref target="JMAP-CORE"/>, Section 5.1) with the following additional parameters
and a custom response.</t>

<t>In addition to the standard <spanx style="verb">accountId</spanx>, <spanx style="verb">ids</spanx>, and <spanx style="verb">properties</spanx>
arguments, Blob/get accepts:</t>

<t><list style="symbols">
  <t>offset: "UnsignedInt|null" (default: null)  <vspace blankLines='1'/>
The starting byte position within the blob.  If null, defaults
  to 0.</t>
  <t>length: "UnsignedInt|null" (default: null)  <vspace blankLines='1'/>
The number of bytes to return.  If null, returns all bytes from
  <spanx style="verb">offset</spanx> to the end of the blob.</t>
  <t>dataSourceProperties: "String[]" (default: ["blobId", "offset", "length"])  <vspace blankLines='1'/>
If supplied, only the properties listed in the array are returned
  for each DataSourceObject in the <spanx style="verb">chunks</spanx> array.  This argument
  has no effect unless <spanx style="verb">chunks</spanx> is included in <spanx style="verb">properties</spanx>.  Available
  properties include <spanx style="verb">blobId</spanx>, <spanx style="verb">size</spanx>, <spanx style="verb">offset</spanx>, <spanx style="verb">length</spanx>,
  <spanx style="verb">position</spanx>, and <spanx style="verb">digest:*</spanx> values where <spanx style="verb">*</spanx> is an algorithm
  name from the <spanx style="verb">supportedDigestAlgorithms</spanx> capability (e.g.
  <spanx style="verb">digest:sha-256</spanx>).</t>
</list></t>

<t>The requestable properties in the <spanx style="verb">properties</spanx> array are:</t>

<t><list style="symbols">
  <t>data:asText  <vspace blankLines='1'/>
The data in the selected range as a UTF-8 string.  If the
  selected bytes are not valid UTF-8 (including truncation in the
  middle of a multi-octet sequence), the response value is null
  and <spanx style="verb">isEncodingProblem</spanx> is set to true.</t>
  <t>data:asBase64  <vspace blankLines='1'/>
The data in the selected range encoded as base64 (<xref target="BASE64"/>).</t>
  <t>data  <vspace blankLines='1'/>
Returns <spanx style="verb">data:asText</spanx> if the selected bytes are valid UTF-8,
  otherwise returns <spanx style="verb">data:asBase64</spanx>.</t>
  <t>digest:&lt;algorithm&gt;  <vspace blankLines='1'/>
The base64-encoded digest of the octets in the selected range,
  computed using the named algorithm: exactly the octets that a
  <spanx style="verb">data</spanx> property would return.  If the range extends past the end
  of the blob, that is the octets from <spanx style="verb">offset</spanx> to the end, or no
  octets if <spanx style="verb">offset</spanx> is past the end.</t>
  <t>size  <vspace blankLines='1'/>
The total size of the blob in octets, regardless of the range
  selected.  Servers <bcp14>SHOULD</bcp14> store the size of a blob in a form that
  is cheap to read, and clients <bcp14>SHOULD</bcp14> request only <spanx style="verb">size</spanx> when
  that is all they need, since fetching blob content can be much
  more expensive for the server.</t>
  <t>imageData  <vspace blankLines='1'/>
If the blob is an image or video type and the server can
  extract metadata, this is an ImageData object.  Otherwise
  null.  Only returned if explicitly requested in <spanx style="verb">properties</spanx>.
  The server <bcp14>MAY</bcp14> need to read the blob content to compute this
  data, so clients <bcp14>SHOULD</bcp14> only request it when needed.  Since
  blobs are immutable, the result for a given blobId will never
  change, and the server <bcp14>SHOULD</bcp14> cache it.  <vspace blankLines='1'/>
An ImageData object has the following properties:  <list style="symbols">
      <t>width: "UnsignedInt|null"
Width of the image in pixels, if known.</t>
      <t>height: "UnsignedInt|null"
Height of the image in pixels, if known.</t>
      <t>orientation: "UnsignedInt|null"
EXIF orientation value (1-8) as defined in <xref target="EXIF"/>.  If present, indicates how
the image should be rotated/flipped for display.</t>
      <t>date: "UTCDate|null"
Date the image or video was captured (from EXIF
DateTimeOriginal or equivalent), if present.</t>
      <t>gps: "ImageGPS|null"
GPS coordinates from EXIF, if present.  An ImageGPS
object has the following properties:
      <list style="symbols">
          <t>latitude: "Number" — Latitude in decimal degrees.</t>
          <t>longitude: "Number" — Longitude in decimal degrees.</t>
        </list></t>
      <t>duration: "Number|null"
Duration in seconds for video content, if known.  This
is a floating-point number to allow sub-second precision.</t>
      <t>comment: "String|null"
Embedded EXIF comment or description, if present.  This
is read-only — it reflects the metadata stored in the
blob content and is not a user-editable property.</t>
    </list></t>
  <t>chunks  <vspace blankLines='1'/>
An array of DataSourceObjects describing the internal chunk
  structure of the blob (see below).  Only returned if explicitly
  requested in <spanx style="verb">properties</spanx>.  The properties returned for each
  DataSourceObject are controlled by the <spanx style="verb">dataSourceProperties</spanx>
  argument.</t>
</list></t>

<t>A <spanx style="verb">digest:*</spanx> name in <spanx style="verb">properties</spanx> or <spanx style="verb">dataSourceProperties</spanx> whose
algorithm is not in the server's <spanx style="verb">supportedDigestAlgorithms</spanx>
capability is rejected with an "invalidArguments" error.</t>

<t>If neither <spanx style="verb">offset</spanx> nor <spanx style="verb">length</spanx> are specified (i.e., both null),
the default properties are <spanx style="verb">data</spanx> and <spanx style="verb">size</spanx>.  Otherwise, the client
<bcp14>MUST</bcp14> specify the <spanx style="verb">properties</spanx> to return.</t>

<t>The response contains a <spanx style="verb">list</spanx> of objects, one per blobId.  Each
object contains the requested properties plus:</t>

<t><list style="symbols">
  <t>id: "BlobId"  <vspace blankLines='1'/>
The blobId of the blob.</t>
  <t>isEncodingProblem: "Boolean" (default: false)  <vspace blankLines='1'/>
Set to true if <spanx style="verb">data</spanx> or <spanx style="verb">data:asText</spanx> was requested but the
  selected range is not valid UTF-8.</t>
  <t>isTruncated: "Boolean" (default: false)  <vspace blankLines='1'/>
Set to true if the selected range extends past the end of the
  blob.  In this case, only the bytes from <spanx style="verb">offset</spanx> to the end of
  the blob (or an empty string if <spanx style="verb">offset</spanx> is past the end) are
  returned.  A null <spanx style="verb">length</spanx> selects everything from <spanx style="verb">offset</spanx> to
  the end, so it sets <spanx style="verb">isTruncated</spanx> only if <spanx style="verb">offset</spanx> is past the
  end of the blob.</t>
  <t>chunks: "DataSourceObject[]"  <vspace blankLines='1'/>
Present only if <spanx style="verb">chunks</spanx> was requested in <spanx style="verb">properties</spanx>.  An
  array of one or more data source objects describing the internal
  chunk structure of the blob.  The blob is reconstructed by
  concatenating the data from each data source object in the
  listed order.  The client <bcp14>MUST</bcp14> use the <spanx style="verb">offset</spanx> and <spanx style="verb">length</spanx>
  of each DataSourceObject to determine which octets to read from
  each chunk's underlying blob.  <vspace blankLines='1'/>
A server that does not store the blob in chunks returns
  a single DataSourceObject covering the entire blob, with
  <spanx style="verb">blobId</spanx> set to the blob's own id, <spanx style="verb">offset</spanx> 0, <spanx style="verb">length</spanx> and
  <spanx style="verb">size</spanx> equal to the size of the blob, and <spanx style="verb">position</spanx> 0.  This
  allows clients to process the <spanx style="verb">chunks</spanx> array the same way
  regardless of how the server stores blobs.</t>
</list></t>

<t>The response also contains:</t>

<t><list style="symbols">
  <t>accountId: "Id"  <vspace blankLines='1'/>
The id of the account used for the operation.</t>
  <t>notFound: "Id[]"  <vspace blankLines='1'/>
An array of blobIds that were not found.</t>
</list></t>

</section>
<section anchor="bloblookup"><name>Blob/lookup</name>

<t>Blob/lookup is defined under the <spanx style="verb">urn:ietf:params:jmap:blob2</spanx>
capability and requires that capability in the request's <spanx style="verb">using</spanx>
array.</t>

<t>This method provides a reverse lookup: given a set of blobIds, it
returns which objects of specified data types reference those blobs.</t>

<t>Since different data types have different semantics of "contains",
the definition of "reference" is somewhat loose, but roughly means
"you could discover this blobId by looking at this object or at
other objects recursively contained within this object".  For
example, with a server that supports <xref target="JMAP-MAIL"/>, if any Email in
a Mailbox references a blob, then that Mailbox references the
blob, and any Thread containing such an Email references it too.
This does not work the other way: an Email that references a
Mailbox in its <spanx style="verb">mailboxIds</spanx> does not thereby reference the blobs of
other Emails in that Mailbox.</t>

<t>The method takes the following arguments:</t>

<t><list style="symbols">
  <t>accountId: "Id"  <vspace blankLines='1'/>
The id of the account to use.</t>
  <t>typeNames: "String[]"  <vspace blankLines='1'/>
A list of data type names to search.  Only type names listed in
  the server's <spanx style="verb">supportedTypeNames</spanx> capability, and whose "JMAP
  Data Types" registry entry has "Can Reference Blobs" set to
  "Yes" (or private types defined to reference blobs), are valid.  If a
  type name is not known by the server or the associated capability
  has not been requested in <spanx style="verb">using</spanx>, the server <bcp14>MUST</bcp14> return an
  "unknownDataType" error.</t>
  <t>ids: "BlobId[]"  <vspace blankLines='1'/>
The blobIds to look up.</t>
</list></t>

<t>The response contains:</t>

<t><list style="symbols">
  <t>accountId: "Id"  <vspace blankLines='1'/>
The id of the account used for the operation.</t>
  <t>list: "BlobInfo[]"  <vspace blankLines='1'/>
A list of BlobInfo objects, one per blobId.  A BlobInfo object
  has the following properties:  <list style="symbols">
      <t>id: "BlobId"
The blobId queried.</t>
      <t>matchedIds: "String[Id[]]"
An object mapping each requested type name to an array of
object ids of that type that reference this blob.  If no
objects of that type reference this blob, the array is empty.</t>
    </list></t>
</list></t>

<t>Access control: if a blob is not visible to the authenticated user or
does not exist on the server at all, the server <bcp14>MUST</bcp14> still return an
empty array for each type name.  This ensures that the response does
not reveal whether the blob exists but is inaccessible to the user.
Likewise, the server <bcp14>MUST NOT</bcp14> return the id of an object that the
user could not discover by querying.  For example, if an Email that
references the blob is in a Mailbox the user cannot see, that Email's
id <bcp14>MUST NOT</bcp14> appear in <spanx style="verb">matchedIds</spanx>.</t>

</section>
<section anchor="the-expires-response-property"><name>The "expires" Response Property</name>

<t>The Blob/set response and the Blob/convert response include the
following property on each BlobObject:</t>

<t><list style="symbols">
  <t>expires: "UTCDate|null"  <vspace blankLines='1'/>
A hint from the server indicating the likely availability of
  the blob.  The blob is likely to remain available until this
  time, and likely not to be available after it.  This is not a
  guarantee in either direction: the server <bcp14>MAY</bcp14> garbage collect
  the blob before this time if it is unreferenced, and <bcp14>MAY</bcp14>
  retain it longer.  If null, the server does not have a
  specific expiry time for the blob.</t>
</list></t>

<t>Clients that need the blob to persist beyond the <spanx style="verb">expires</spanx> time
should reference it from a persistent object (e.g., a FileNode
or an Email) before it expires.</t>

</section>
<section anchor="blobconvert"><name>Blob/convert</name>

<t>Blob/convert is defined under the <spanx style="verb">urn:ietf:params:jmap:blob2</spanx>
capability and requires that capability in the request's <spanx style="verb">using</spanx>
array.</t>

<t>Blob/convert performs server-side transformations on blobs.  Like
Blob/set, it takes an <spanx style="verb">accountId</spanx> and a <spanx style="verb">create</spanx> argument that maps
creation ids to conversion request objects.</t>

<t>Each conversion request object <bcp14>MAY</bcp14> also include the following property:</t>

<t><list style="symbols">
  <t>noPersist: "Boolean" (default: false)
If true, the resulting blob is ephemeral: it may be referenced via
creation id backreferences within the same JMAP request, but the
server is not required to persist it beyond the lifetime of the
request.  The server <bcp14>MAY</bcp14> omit ephemeral blobs from the <spanx style="verb">created</spanx>
map of the response and from the <spanx style="verb">createdIds</spanx> of the final Response
object if it did not create a referenceable blob.</t>
</list></t>

<t>Each conversion request object <bcp14>MUST</bcp14> contain exactly one of the
following properties, which determines the type of conversion:</t>

<t><list style="symbols">
  <t>imageConvert: ImageConvertRecipe</t>
  <t>archive: ArchiveRecipe</t>
  <t>extract: ExtractRecipe</t>
  <t>compress: CompressRecipe</t>
  <t>decompress: DecompressRecipe</t>
  <t>delta: DeltaRecipe</t>
  <t>patch: PatchRecipe</t>
</list></t>

<t>The response has the same structure as Blob/set: a <spanx style="verb">created</spanx> map of
creation id to a BlobObject for each successful conversion, and a
<spanx style="verb">notCreated</spanx> map of creation id to a SetError object for each failed
conversion.  The <spanx style="verb">id</spanx> is the blobId of the created blob.  The
response also includes an <spanx style="verb">expires</spanx> property on each BlobObject (see
"The expires Response Property" above).</t>

<t>If the conversion completed but encountered problems (e.g., a
corrupt archive where some entries extracted successfully but
others did not, or a truncated compressed stream that partially
decompressed), the response for that creation also includes:</t>

<t><list style="symbols">
  <t>isIncomplete: "Boolean" (default: false)
If true, the conversion did not complete cleanly.  The output
blob may be partial or missing some content.</t>
  <t>description: "String|null"
A human-readable description of the problem, if any.</t>
</list></t>

<t>If the conversion failed entirely and no usable output could be
produced, the server <bcp14>MUST</bcp14> return a <spanx style="verb">conversionFailed</spanx> SetError
in the <spanx style="verb">notCreated</spanx> map.</t>

<t>Creation id backreferences (using the <spanx style="verb">#</spanx> prefix) resolve to
the <spanx style="verb">id</spanx> of the created blob and may be used in subsequent
conversions within the same Blob/convert call or in later
method calls within the same JMAP request.</t>

<t>A server <bcp14>MAY</bcp14> return a blobId for a conversion result without
immediately generating the output data.  In this case the server
<bcp14>MUST</bcp14> generate the data when the blob is later accessed (e.g., via
a download request or as input to another operation).  This allows
the server to respond quickly to Blob/convert requests while
deferring expensive work such as image resizing or archive
creation.  The returned blobId <bcp14>MUST</bcp14> be usable in all contexts
where a regular blobId is accepted.  If the exact size of the output
is not yet known, the server returns a null <spanx style="verb">size</spanx> for that
creation.  If the deferred generation later fails (e.g., the source
blob has expired), the server treats the blob as not existing: a
download returns 404 (Not Found), Blob/get reports it in <spanx style="verb">notFound</spanx>,
and a creation in Blob/set or Blob/convert that references it fails
with a "notFound" SetError.  If a client later requests the <spanx style="verb">size</spanx> property via
Blob/get for a deferred blob, the server <bcp14>MUST</bcp14> generate the blob
at that point and return the actual size.</t>

<t>The server <bcp14>MUST</bcp14> resolve the order of dependencies between entries
in the <spanx style="verb">create</spanx> map and process them in an order such that all
backreferences are satisfied.  If a dependency cycle is detected,
all members of the cycle <bcp14>MUST</bcp14> be rejected with an
"invalidProperties" error.</t>

<section anchor="imageconvertrecipe"><name>ImageConvertRecipe</name>

<t>An ImageConvertRecipe converts an image blob to a different format
or size.  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the source image.</t>
  <t>type: "String"
Media type (<xref target="MEDIA-TYPES"/>) of the image to create (e.g.
"image/png").  <bcp14>MUST</bcp14> be one of the values in the server's
<spanx style="verb">supportedImageWriteTypes</spanx> capability.  The source image <bcp14>MUST</bcp14>
be in a format listed in <spanx style="verb">supportedImageReadTypes</spanx>.</t>
  <t>width: "UnsignedInt|null"
Maximum width in pixels of the image to create.  If null, the
server preserves the source width (or scales proportionally if
only <spanx style="verb">height</spanx> is given).</t>
  <t>height: "UnsignedInt|null"
Maximum height in pixels of the image to create.  If null, the
server preserves the source height (or scales proportionally if
only <spanx style="verb">width</spanx> is given).</t>
  <t>ignoreAspect: "Boolean|null"
If true, resize to exactly the given width and height, even if
the aspect ratio is changed.  If null or false, the image is
scaled to fit within the given dimensions while preserving the
aspect ratio.</t>
  <t>quality: "UnsignedInt|null"
Compression quality for lossy formats, as a value from 1 (lowest
quality, smallest file) to 100 (highest quality, largest file).
Only meaningful for formats that support lossy compression such as
image/jpeg and image/webp.  If null, the server selects a sensible
default.</t>
  <t>colorSpace: "String|null"
The color space for the output image.  Defined values are "sRGB"
and "grayscale".  If null, the server preserves the source image's
color space where possible.</t>
  <t>background: "String|null"
A fill color to use when the source image has transparency but the
target format does not support it (e.g. converting PNG to JPEG).
The value is a CSS-style hex color string (e.g. "#ffffff" for white).
If null, the server selects a sensible default (typically white).</t>
  <t>stripMetadata: "Boolean|null"
If true, strip image metadata such as EXIF, XMP, and IPTC data from
the output.  If null or false, the server preserves metadata where
the target format supports it.</t>
  <t>autoOrient: "Boolean|null"
If true, automatically rotate and flip the image according to its
EXIF orientation tag, then reset the tag.  If null or false, the
image data is not reoriented.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"invalidProperties" — the type is not in
<spanx style="verb">supportedImageWriteTypes</spanx>, or the source blob is not in a format
listed in <spanx style="verb">supportedImageReadTypes</spanx>.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>, or the
requested dimensions exceed <spanx style="verb">maxImageDimension</spanx>.</t>
  <t>"conversionFailed" — the image conversion failed entirely.</t>
</list></t>

</section>
<section anchor="archiverecipe"><name>ArchiveRecipe</name>

<t>An ArchiveRecipe creates an archive blob from a list of entries.
It is an object with the following properties:</t>

<t><list style="symbols">
  <t>type: "String"
The media type (<xref target="MEDIA-TYPES"/>) of the archive to create.  <bcp14>MUST</bcp14> be
one of the values in the server's <spanx style="verb">supportedArchiveTypes</spanx> capability.</t>
  <t>entries: "ArchiveEntry[]"
An array of ArchiveEntry objects describing the contents of the
archive.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — a referenced entry blobId does not exist.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedArchiveTypes</spanx>;
an entry has an unsupported entryType for the archive format; or
a required field (e.g. linkTarget for symlink entries) is missing.</t>
  <t>"tooLarge" — the number of entries exceeds <spanx style="verb">maxArchiveEntries</spanx>,
or a referenced blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
  <t>"conversionFailed" — the archive creation failed entirely.</t>
</list></t>

</section>
<section anchor="archiveentry"><name>ArchiveEntry</name>

<t>An ArchiveEntry describes a single entry in an archive.  It is used
both as input (in ArchiveRecipe) and as output (in ExtractRecipe
results).  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>name: "String"
The path of the entry within the archive.  Directory entries <bcp14>MUST</bcp14>
have a name ending with "/".</t>
  <t>blobId: "BlobId|null"
The blobId of the content for this entry.  <bcp14>MUST</bcp14> be non-null for
file entries.  <bcp14>MUST</bcp14> be null or absent for directory, symlink,
hardlink, fifo, and device entries.  Violating these constraints
is an "invalidProperties" error.</t>
  <t>entryType: "String|null"
The type of the entry.  If null, defaults to "file".  Defined values
are "file" (a regular file, the default), "directory", "symlink"
(a symbolic link), "hardlink" (a hard link), "fifo" (a named pipe),
"blockDevice" (a block device node), and "charDevice" (a character
device node).  The server <bcp14>MUST</bcp14> reject entries with unsupported
types for the chosen archive format with an "invalidProperties"
error.</t>
  <t>modified: "UTCDate|null"
The modification time of the entry.  If null, defaults to the current server time.</t>
  <t>created: "UTCDate|null"
The creation time of the entry, or null if it has none.  Formats
that cannot record a creation time ignore it.</t>
  <t>linkTarget: "String|null"
The target path for symlink and hardlink entries.  <bcp14>MUST</bcp14> be non-null
when entryType is "symlink" or "hardlink".  <bcp14>MUST</bcp14> be null for all
other entry types.</t>
  <t>mode: "String|null"
Unix file permissions as an octal string (e.g. "0755", "0644").
If null, the server chooses a reasonable default.  This is
represented as a string rather than an integer to avoid ambiguity
between octal and decimal interpretation.</t>
  <t>uid: "UnsignedInt|null"
The numeric user ID of the entry owner.</t>
  <t>gid: "UnsignedInt|null"
The numeric group ID of the entry owner.</t>
  <t>ownerName: "String|null"
The user name of the entry owner.</t>
  <t>groupName: "String|null"
The group name of the entry owner.</t>
  <t>devMajor: "UnsignedInt|null"
The major device number for "blockDevice" and "charDevice" entries.</t>
  <t>devMinor: "UnsignedInt|null"
The minor device number for "blockDevice" and "charDevice" entries.</t>
  <t>comment: "String|null"
A comment string for this entry.</t>
  <t>compressionMethod: "String|null"
The per-entry compression method.  Defined values are "store" (no
compression) and "deflate".  If null, the server chooses a
reasonable default.</t>
</list></t>

<section anchor="considerations-for-applicationzip"><name>Considerations for application/zip</name>

<t>The zip format only supports "file" and "directory" entry types.
The <spanx style="verb">comment</spanx> and <spanx style="verb">compressionMethod</spanx> properties are only meaningful
for zip archives.  The <spanx style="verb">created</spanx> time is stored in an extra field.
The <spanx style="verb">mode</spanx>, <spanx style="verb">uid</spanx>, <spanx style="verb">gid</spanx>, <spanx style="verb">ownerName</spanx>,
<spanx style="verb">groupName</spanx>, <spanx style="verb">devMajor</spanx>, and <spanx style="verb">devMinor</spanx> properties are ignored.</t>

</section>
<section anchor="considerations-for-applicationx-tar"><name>Considerations for application/x-tar</name>

<t>The tar format supports all entry types.  The <spanx style="verb">mode</spanx>, <spanx style="verb">uid</spanx>, <spanx style="verb">gid</spanx>,
<spanx style="verb">ownerName</spanx>, <spanx style="verb">groupName</spanx>, <spanx style="verb">devMajor</spanx>, and <spanx style="verb">devMinor</spanx> properties are
meaningful for tar archives.  The <spanx style="verb">created</spanx>, <spanx style="verb">comment</spanx>, and
<spanx style="verb">compressionMethod</spanx> properties are ignored.</t>

<t>Tar archives are not inherently compressed.  To create a compressed
tar archive (e.g. a .tar.gz file), first create the tar archive
using ArchiveRecipe, then compress the result using CompressRecipe
(see "Creating a Compressed Tar Archive" in "Examples").</t>

</section>
<section anchor="considerations-for-applicationx-cpio"><name>Considerations for application/x-cpio</name>

<t>The cpio format supports all entry types except that <spanx style="verb">ownerName</spanx> and
<spanx style="verb">groupName</spanx> are not supported.  The <spanx style="verb">created</spanx>, <spanx style="verb">comment</spanx>, and
<spanx style="verb">compressionMethod</spanx> properties are ignored.</t>

</section>
</section>
<section anchor="extractrecipe"><name>ExtractRecipe</name>

<t>An ExtractRecipe extracts the entry listing from an existing archive
blob.  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the archive to extract.</t>
  <t>type: "String|null"
The media type of the archive format.  If null, the server <bcp14>SHOULD</bcp14>
attempt to auto-detect the format from the blob content (e.g. by
inspecting magic bytes).  If auto-detection fails, the server <bcp14>MUST</bcp14>
return an "unknownFormat" error.</t>
</list></t>

<t>An ExtractRecipe creates no blob.  The <spanx style="verb">id</spanx>, <spanx style="verb">type</spanx>, and <spanx style="verb">size</spanx> in
its result are those of the archive blob that was extracted, and a
backreference to its creation id resolves to that blob.  <spanx style="verb">noPersist</spanx>
has no effect on an ExtractRecipe.  A successful ExtractRecipe
result also includes:</t>

<t><list style="symbols">
  <t>entries: "ArchiveEntry[]"
An array of ArchiveEntry objects describing the contents of the
archive.  Each file entry will have a blobId that can be used to
access the content of that entry.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"unknownFormat" — the server could not determine or does not support
the archive format.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedExtractTypes</spanx>.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
  <t>"conversionFailed" — the extraction failed entirely.</t>
</list></t>

</section>
<section anchor="compressrecipe"><name>CompressRecipe</name>

<t>A CompressRecipe compresses a blob using a specified compression
algorithm.  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the data to compress.</t>
  <t>type: "String"
The media type (<xref target="MEDIA-TYPES"/>) of the compression format to use.
<bcp14>MUST</bcp14> be one of the values in the server's <spanx style="verb">supportedCompressTypes</spanx>
capability.</t>
  <t>level: "UnsignedInt|null"
The compression level, where higher values produce smaller output
at the cost of more CPU time.  If null, the server uses the
format's default level.  The valid range depends on the format;
if the requested level is outside the valid range, the server
<bcp14>SHOULD</bcp14> use the nearest valid value.</t>
  <t>checksum: "Boolean|null"
If true, include an integrity checksum in the compressed output.
If null, the server uses the format's default behaviour.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedCompressTypes</spanx>.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
  <t>"conversionFailed" — the compression failed entirely.</t>
</list></t>

<section anchor="considerations-for-applicationgzip"><name>Considerations for application/gzip</name>

<t>Compression level ranges from 1 (fastest) to 9 (best compression).
The default is typically 6.  Gzip always includes a CRC-32 checksum;
the <spanx style="verb">checksum</spanx> property is ignored.</t>

</section>
<section anchor="considerations-for-applicationx-bzip2"><name>Considerations for application/x-bzip2</name>

<t>Compression level ranges from 1 (fastest, 100k block size) to 9
(best compression, 900k block size).  The default is typically 9.
Bzip2 always includes a CRC-32 checksum; the <spanx style="verb">checksum</spanx> property is
ignored.</t>

</section>
<section anchor="considerations-for-applicationx-xz"><name>Considerations for application/x-xz</name>

<t>Compression level ranges from 0 (fastest) to 9 (best compression).
The default is typically 6.  Xz always includes an integrity check;
if <spanx style="verb">checksum</spanx> is true the server <bcp14>SHOULD</bcp14> use SHA-256, otherwise CRC-64
is used by default.</t>

</section>
<section anchor="considerations-for-applicationzstd"><name>Considerations for application/zstd</name>

<t>Compression level ranges from 1 (fastest) to 22 (best compression).
The default is typically 3.  If <spanx style="verb">checksum</spanx> is true, an xxHash-64
checksum is included in the frame; the default is false.</t>

</section>
</section>
<section anchor="decompressrecipe"><name>DecompressRecipe</name>

<t>A DecompressRecipe decompresses a compressed blob.  It is an object
with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the compressed data to decompress.</t>
  <t>type: "String|null"
The media type of the compression format.  If null, the server <bcp14>SHOULD</bcp14>
attempt to auto-detect the format from magic bytes.  If auto-detection
fails, the server <bcp14>MUST</bcp14> return an "unknownFormat" error.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"unknownFormat" — the server could not determine or does not support
the compression format.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedDecompressTypes</spanx>.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
  <t>"conversionFailed" — the decompression failed entirely.</t>
</list></t>

</section>
<section anchor="deltarecipe"><name>DeltaRecipe</name>

<t>A DeltaRecipe computes a delta between two blobs.  It is an object
with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the original (base) blob.</t>
  <t>newBlobId: "BlobId"
The blobId of the new blob to compare against.</t>
  <t>type: "String"
The media type of the delta format to produce.  <bcp14>MUST</bcp14> be one of the
values in the server's <spanx style="verb">supportedDeltaTypes</spanx> capability.</t>
</list></t>

<t>The result blob is the computed delta, which can be applied to the
base blob using PatchRecipe to reconstruct the new blob.</t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — a referenced blobId does not exist.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedDeltaTypes</spanx>.</t>
  <t>"tooLarge" — a referenced blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
  <t>"conversionFailed" — the delta computation failed entirely.</t>
</list></t>

<section anchor="considerations-for-applicationx-rdiff-delta"><name>Considerations for application/x-rdiff-delta</name>

<t>The server computes an rdiff signature of the base blob and then
generates a delta against the new blob.  The resulting delta blob
can only be applied to the exact base blob used to generate it.</t>

</section>
<section anchor="considerations-for-applicationx-bsdiff"><name>Considerations for application/x-bsdiff</name>

<t>The server produces a bsdiff-format patch.  Both blobs must fit in
memory; servers <bcp14>MAY</bcp14> reject very large blobs with a "tooLarge" error.</t>

</section>
<section anchor="considerations-for-textx-diff"><name>Considerations for text/x-diff</name>

<t>The server produces a unified diff.  Both blobs are interpreted as
text.  If either blob contains content that cannot be interpreted as
text, the server <bcp14>MUST</bcp14> return an "unknownFormat" error.</t>

</section>
</section>
<section anchor="patchrecipe"><name>PatchRecipe</name>

<t>A PatchRecipe applies a delta to a base blob to produce a new blob.
It is an object with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the base blob to patch.</t>
  <t>deltaBlobId: "BlobId"
The blobId of the delta to apply.</t>
  <t>deltaType: "String"
The media type of the delta format.  <bcp14>MUST</bcp14> be one of the values in
the server's <spanx style="verb">supportedPatchTypes</spanx> capability.</t>
</list></t>

<t>The result blob is the patched output.</t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — a referenced blobId does not exist.</t>
  <t>"unknownFormat" — the delta blob is not valid for the specified
format (e.g., corrupt or malformed delta data).</t>
  <t>"invalidProperties" — the deltaType is not in <spanx style="verb">supportedPatchTypes</spanx>.</t>
  <t>"tooLarge" — a referenced blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
  <t>"conversionFailed" — the patch application failed entirely.</t>
</list></t>

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

<section anchor="uploading-a-blob-inline"><name>Uploading a Blob Inline</name>

<t>This example creates a blob from inline text data:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/set", {
  "accountId": "abc",
  "create": {
    "b1": {
      "data": [{"data:asText": "Hello, world!"}],
      "type": "text/plain"
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>The response:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/set", {
  "accountId": "abc",
  "created": {
    "b1": {
      "id": "Babc123",
      "type": "text/plain",
      "size": 13
    }
  },
  "notCreated": null
}, "0"]]
]]></sourcecode></figure>

</section>
<section anchor="querying-blob-chunks"><name>Querying Blob Chunks</name>

<t>This example fetches a blob's chunk structure with offsets, sizes,
and SHA-256 digests:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/get", {
  "accountId": "abc",
  "ids": ["B1a2b3c"],
  "properties": ["size", "chunks"],
  "dataSourceProperties": [
    "blobId", "size", "offset", "length", "position",
    "digest:sha-256"
  ]
}, "0"]]
]]></sourcecode></figure>

<t>The response shows the blob is stored as two chunks:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/get", {
  "accountId": "abc",
  "list": [{
    "id": "B1a2b3c",
    "size": 10485760,
    "chunks": [
      {
        "blobId": "Bchunk1",
        "size": 5242880,
        "offset": 0,
        "length": 5242880,
        "position": 0,
        "digest:sha-256": "a1b2c3..."
      },
      {
        "blobId": "Bchunk2",
        "size": 5242880,
        "offset": 0,
        "length": 5242880,
        "position": 5242880,
        "digest:sha-256": "d4e5f6..."
      }
    ]
  }],
  "notFound": []
}, "0"]]
]]></sourcecode></figure>

<t>The <spanx style="verb">position</spanx> values show where each chunk fits in the assembled
blob, and the <spanx style="verb">digest:sha-256</spanx> values can be used to verify chunk
integrity.</t>

</section>
<section anchor="looking-up-blob-references"><name>Looking Up Blob References</name>

<t>This example finds which Mailbox and Email objects reference two
blobs:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/lookup", {
  "accountId": "abc",
  "typeNames": ["Mailbox", "Email"],
  "ids": ["Bfirst", "Bsecond"]
}, "0"]]
]]></sourcecode></figure>

<t>The response shows that the first blob is referenced by two emails
in the same mailbox, and the second blob is not referenced by any
objects of the requested types (or is not visible to the user):</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/lookup", {
  "accountId": "abc",
  "list": [
    {
      "id": "Bfirst",
      "matchedIds": {
        "Mailbox": ["M1"],
        "Email": ["E1", "E2"]
      }
    },
    {
      "id": "Bsecond",
      "matchedIds": {
        "Mailbox": [],
        "Email": []
      }
    }
  ]
}, "0"]]
]]></sourcecode></figure>

</section>
<section anchor="creating-a-zip-archive"><name>Creating a Zip Archive</name>

<t>This example creates a zip file containing an HTML document, a CSS
file, and a JPEG image:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "z1": {
      "archive": {
        "type": "application/zip",
        "entries": [
          {
            "name": "site/index.html",
            "blobId": "Baaaa"
          },
          {
            "name": "site/style.css",
            "blobId": "Bbbbb"
          },
          {
            "name": "site/photo.jpg",
            "blobId": "Bcccc"
          }
        ]
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>The response includes the blobId, type, and size of the created
archive:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "z1": {
      "id": "B9f2a4e",
      "type": "application/zip",
      "size": 104857
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

</section>
<section anchor="creating-a-compressed-tar-archive"><name>Creating a Compressed Tar Archive</name>

<t>This example creates a .tar.gz file from the same three files.
The intermediate tar blob uses <spanx style="verb">noPersist</spanx> since only the final
compressed result is needed:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "t1": {
      "noPersist": true,
      "archive": {
        "type": "application/x-tar",
        "entries": [
          {
            "name": "site/index.html",
            "blobId": "Baaaa",
            "modified": "2026-03-01T12:00:00Z",
            "mode": "0644"
          },
          {
            "name": "site/style.css",
            "blobId": "Bbbbb",
            "modified": "2026-03-01T12:00:00Z",
            "mode": "0644"
          },
          {
            "name": "site/photo.jpg",
            "blobId": "Bcccc",
            "modified": "2026-02-15T09:30:00Z",
            "mode": "0644"
          }
        ]
      }
    },
    "t2": {
      "compress": {
        "blobId": "#t1",
        "type": "application/gzip"
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>Because "t1" was created with <spanx style="verb">noPersist</spanx>, the server may omit it
from the response:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "t2": {
      "id": "Bd81c7f",
      "type": "application/gzip",
      "size": 98304
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

</section>
<section anchor="extracting-a-compressed-tar-archive"><name>Extracting a Compressed Tar Archive</name>

<t>This example decompresses and extracts a .tar.gz file to discover
its contents.  The intermediate decompressed tar blob uses
<spanx style="verb">noPersist</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "u1": {
      "noPersist": true,
      "decompress": {
        "blobId": "Bd81c7f",
        "type": "application/gzip"
      }
    },
    "u2": {
      "extract": {
        "blobId": "#u1",
        "type": "application/x-tar"
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>The response for the ExtractRecipe gives the <spanx style="verb">id</spanx>, <spanx style="verb">type</spanx>, and
<spanx style="verb">size</spanx> of the archive it extracted, which here is the decompressed
tar created by "u1", and an <spanx style="verb">entries</spanx> array listing the archive
contents, with a blobId for each file entry:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "u2": {
      "id": "Be3a901",
      "type": "application/x-tar",
      "size": 102400,
      "entries": [
        {
          "name": "site/index.html",
          "blobId": "Bdd001",
          "entryType": "file",
          "modified": "2026-03-01T12:00:00Z",
          "mode": "0644"
        },
        {
          "name": "site/style.css",
          "blobId": "Bdd002",
          "entryType": "file",
          "modified": "2026-03-01T12:00:00Z",
          "mode": "0644"
        },
        {
          "name": "site/photo.jpg",
          "blobId": "Bdd003",
          "entryType": "file",
          "modified": "2026-02-15T09:30:00Z",
          "mode": "0644"
        }
      ]
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

<t>The returned blobIds ("Bdd001", "Bdd002", "Bdd003") can be used
to download individual files or as inputs to further Blob/convert
operations.</t>

</section>
<section anchor="computing-and-applying-a-delta"><name>Computing and Applying a Delta</name>

<t>This example computes a unified diff between two versions of a
text file:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "d1": {
      "delta": {
        "blobId": "BoldVersion",
        "newBlobId": "BnewVersion",
        "type": "text/x-diff"
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>The response contains the delta blob:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "d1": {
      "id": "Bdelta789",
      "type": "text/x-diff",
      "size": 1234
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

<t>The delta can later be applied to the original blob to reconstruct
the new version:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "p1": {
      "patch": {
        "blobId": "BoldVersion",
        "deltaBlobId": "Bdelta789",
        "deltaType": "text/x-diff"
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>The result is a blob identical to "BnewVersion":</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "p1": {
      "id": "Breconstructed",
      "type": "application/octet-stream",
      "size": 48576
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

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

<t>All security considerations from <xref target="JMAP-CORE"/> apply to this document.</t>

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

<t>Servers <bcp14>MUST NOT</bcp14> allow a client to access blob data that the
authenticated user does not have permission to access.  When a
DataSourceObject references a blobId, the server <bcp14>MUST</bcp14> verify that the
requesting user has access to that blob.</t>

</section>
<section anchor="untrusted-data"><name>Untrusted Data</name>

<t>Clients that create blobs from inline data (data:asText or
data:asBase64) <bcp14>MUST NOT</bcp14> assume that the server will accept all
possible values.  Servers <bcp14>MUST</bcp14> reject malformed inputs as specified
in the DataSourceObject definition.</t>

<t>JSON parsers are not all consistent in handling non-UTF-8 data, and
JMAP requires all JSON to be UTF-8, so a server <bcp14>MUST</bcp14> return null for
<spanx style="verb">data:asText</spanx> (setting <spanx style="verb">isEncodingProblem</spanx>) rather than return octets
that are not valid UTF-8.</t>

<t>The server <bcp14>MUST NOT</bcp14> trust that the data given to Blob/set is a
well-formed instance of its stated media type.  If the server parses
a blob — to convert it, extract an archive, or read image metadata
— it <bcp14>SHOULD</bcp14> only use hardened parsers designed to deal with
arbitrary untrusted data.  The server <bcp14>SHOULD NOT</bcp14> reject data on the
grounds that it is not a valid specimen of the stated type.</t>

</section>
<section anchor="resource-consumption"><name>Resource Consumption</name>

<t>Several operations defined in this document can consume significant
server resources.</t>

<t>Archive and compression operations may require substantial CPU and
memory.  Servers <bcp14>SHOULD</bcp14> impose reasonable limits on archive size,
number of entries, nesting depth of archives within archives,
compression ratios (to mitigate zip bomb attacks), and total
processing time.  Servers <bcp14>SHOULD</bcp14> reject requests that would exceed
these limits with a "tooLarge" or "serverFail" error as appropriate.</t>

<t>Image conversion can also consume significant resources, especially
for very large images or high output dimensions.</t>

<t>Digest algorithms can be expensive to calculate over large blobs.
Servers that share resources between users <bcp14>SHOULD</bcp14> track resource use
by clients and rate-limit expensive operations, such as computing
digests in Blob/get or verifying them in Blob/set, to avoid
resource starvation.</t>

<t>Delta and patch operations can also be resource-intensive,
particularly for large blobs.  Servers <bcp14>SHOULD</bcp14> impose limits on the
size of blobs that can be used as inputs to these operations.</t>

<t>Servers <bcp14>SHOULD</bcp14> advertise their limits via the <spanx style="verb">maxConvertSize</spanx>,
<spanx style="verb">maxArchiveEntries</spanx>, and <spanx style="verb">maxImageDimension</spanx> capability properties
so that clients can avoid making requests that will be rejected.
Even when these properties are not advertised, servers <bcp14>SHOULD</bcp14> set
sensible internal limits and reject requests that exceed them.</t>

</section>
<section anchor="archive-path-traversal"><name>Archive Path Traversal</name>

<t>Archive formats allow entry names containing path separators and
relative path components such as "../".  Malicious archives may use
names like "../../etc/passwd" to attempt directory traversal.  While
ExtractRecipe only returns entry metadata and blob references
(not files on the server filesystem), clients that extract archive
contents to a filesystem <bcp14>MUST</bcp14> validate entry names and reject or
sanitize paths containing ".." components or absolute paths.
Servers <bcp14>SHOULD</bcp14> reject ArchiveRecipe requests containing entry names
with ".." path components.</t>

</section>
<section anchor="content-smuggling"><name>Content Smuggling</name>

<t>The ability to split content into multiple blobs, recombine them via
Blob/set, and apply delta patches may be used to bypass security
scanners that inspect blob content: carefully chosen data sources
can recreate dangerous content on the far side of a scanner watching
the upload endpoint.  Servers that perform content scanning <bcp14>SHOULD</bcp14>
provide a hook to scan the blob that results from concatenating the
data sources in Blob/set, in the same way as blobs arriving through
the upload endpoint, and <bcp14>SHOULD</bcp14> scan the output of Blob/convert
operations as well as the inputs.</t>

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

<section anchor="jmap-capability-registration-for-urnietfparamsjmapblob2"><name>JMAP Capability Registration for urn:ietf:params:jmap:blob2</name>

<t>IANA is requested to register the "Blob Management" Capability as follows:</t>

<t>Capability Name: urn:ietf:params:jmap:blob2</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Specification document: this document</t>

<t>Security and privacy considerations: this document, Security Considerations</t>

</section>
<section anchor="jmap-capability-update-for-urnietfparamsjmapblob"><name>JMAP Capability Update for urn:ietf:params:jmap:blob</name>

<t>IANA is requested to update the "urn:ietf:params:jmap:blob"
capability, registered by <xref target="JMAP-BLOB"/>, as follows:</t>

<t>Capability Name: urn:ietf:params:jmap:blob</t>

<t>Specification document: <xref target="JMAP-BLOB"/>, superseded by this document</t>

<t>Intended use: obsolete</t>

<t>Change Controller: IETF</t>

<t>Security and privacy considerations: <xref target="JMAP-BLOB"/>, Section 5</t>

</section>
<section anchor="jmap-error-code-update-for-unknowndatatype"><name>JMAP Error Code Update for unknownDataType</name>

<t>IANA is requested to update the "unknownDataType" entry in the "JMAP
Error Codes" registry, registered by <xref target="JMAP-BLOB"/>, as follows:</t>

<t>JMAP Error Code: unknownDataType</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: The server does not recognise the data type specified
in the typeNames array of a Blob/lookup request, or the capability
required to use that data type has not been included in the <spanx style="verb">using</spanx>
array of the request.</t>

<t>Reference: this document (replacing <xref target="JMAP-BLOB"/>)</t>

</section>
<section anchor="jmap-error-code-registrations"><name>JMAP Error Code Registrations</name>

<t>IANA is requested to register the following entries in the "JMAP
Error Codes" registry:</t>

<section anchor="unknownformat"><name>unknownFormat</name>

<t>JMAP Error Code: unknownFormat</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: The server could not determine the format of the blob,
or the detected format is not supported.  This error is returned
when auto-detection of archive or compression format fails, or when
the blob content does not match the specified format.</t>

<t>Reference: this document</t>

</section>
<section anchor="blobhasreference"><name>blobHasReference</name>

<t>JMAP Error Code: blobHasReference</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: The blob cannot be destroyed because it is still
referenced by one or more objects.  The client can use Blob/lookup
to discover which objects reference the blob.</t>

<t>Reference: this document</t>

</section>
<section anchor="conversionfailed"><name>conversionFailed</name>

<t>JMAP Error Code: conversionFailed</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: The server was unable to perform the requested blob
conversion.</t>

<t>Reference: this document</t>

</section>
</section>
<section anchor="jmap-data-types-registry"><name>JMAP Data Types Registry</name>

<t>IANA is requested to update the reference for the "JMAP Data Types"
registry to this document (replacing the reference to
<xref target="JMAP-BLOB"/>).  The registry's fields, registration policy, and
instructions to the designated experts below are carried forward
unchanged from <xref target="JMAP-BLOB"/>, so that they remain defined in a
current document.  The existing entries are unchanged.</t>

<t>Each entry has the following fields:</t>

<t>Type Name: the name of the data type, as used in <spanx style="verb">typeNames</spanx> in
Blob/lookup and as a key in a StateChange object (<xref target="JMAP-CORE"/>,
Section 7.1).</t>

<t>Can Reference Blobs: "Yes" if objects of this type can reference
blobs (see "Blob/lookup"), otherwise "No".</t>

<t>Can Use for State Change: "Yes" if the type name can appear in a
StateChange object, otherwise "No".</t>

<t>Capability: the capability URI that a client includes in <spanx style="verb">using</spanx> to
use this data type.</t>

<t>Reference: the document that defines the data type.</t>

<t>The registration policy for this registry is "Specification
Required" <xref target="IANA-GUIDELINES"/>.  Either an RFC or a similarly stable reference
document defines a JMAP Data Type and associated capability.</t>

<t>IANA will appoint designated experts to review requests for
additions to this registry, with guidance to allow any registration
that provides a stable document describing the capability and
control over the URI namespace to which the capability URI points.</t>

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

<t>EDITOR: please remove this section before publication.</t>

<t>The source of this document exists on github at: https://github.com/brong/draft-gondwana-jmap-blobext/</t>

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

<t><list style="symbols">
  <t>Added <spanx style="verb">created</spanx> to ArchiveEntry.</t>
  <t>Carried over from RFC9404 what this document had lost: Blob/lookup
does not return ids of objects the user cannot discover, the
meaning of "reference" and the "Can Reference Blobs" restriction,
the server's handling of untrusted blob data, scanning of
concatenated blobs, the cost of digests, the request size limit
for inline data, and the hints about fetching <spanx style="verb">size</spanx>.</t>
  <t>Digest algorithm names come from the "Hash Algorithms for HTTP
Digest Fields" registry of RFC9530 (which replaces the RFC3230
registry RFC9404 used), not the "Hash Function Textual Names"
registry, where SHA-1 is "sha-1".  Servers list algorithms in
their order of preference, only ones they can compute efficiently,
and clients use the first they support; "sha" (deprecated there)
remains allowed.</t>
  <t>A Blob/get digest is over exactly the octets returned for the
range, including when the range runs past the end of the blob.</t>
  <t>Added optional <spanx style="verb">size</spanx> and <spanx style="verb">digest:&lt;algorithm&gt;</spanx> properties to the
BlobCreateObject, checked against the whole blob being created, so
a client can verify an assembled or inline upload in the same
call.  (RFC9404 defined neither; per-source values were already
checked on each DataSourceObject.)</t>
  <t>Restated the registration policy and designated expert guidance
for the "JMAP Data Types" registry, so they are not left only in
the obsoleted RFC9404.</t>
  <t>Blobs have no state, as in RFC9404: Blob/set takes no <spanx style="verb">ifInState</spanx>
and returns null <spanx style="verb">oldState</spanx> and <spanx style="verb">newState</spanx>.  (Thanks to Mark
Atwood.)</t>
  <t>The <spanx style="verb">dataSourceProperties</spanx> default is ["blobId", "offset",
"length"], so chunks fed back into Blob/set keep their ranges.
(Thanks to Mark Atwood.)</t>
  <t>Named the SetErrors for Blob/set: "invalidProperties" for an
invalid DataSourceObject, "tooLarge" for exceeding
<spanx style="verb">maxDataSources</spanx> or <spanx style="verb">maxSizeBlobSet</spanx>, and "notFound" for an unknown
blobId.  An unsupported <spanx style="verb">digest:*</spanx> name in Blob/get is
"invalidArguments".  (Thanks to Mark Atwood.)</t>
  <t>BlobObject <spanx style="verb">size</spanx> is null until a deferred Blob/convert result is
generated, and a deferred result whose generation fails is treated
as not existing everywhere.  (Thanks to Mark Atwood.)</t>
  <t>The <spanx style="verb">id</spanx>, <spanx style="verb">type</spanx>, and <spanx style="verb">size</spanx> of an ExtractRecipe result are those
of the archive it extracted.  (Thanks to Mark Atwood.)</t>
  <t>IANA: the "urn:ietf:params:jmap:blob" capability is marked
obsolete, "unknownDataType" is updated rather than registered
again, and the "JMAP Data Types" registry's fields are defined
here.  RFC9404 is now an informative reference.  (Thanks to Mark
Atwood.)</t>
  <t>Editorial: removed a duplicate .tar.gz example, used "media type"
throughout, added a reference for EXIF, and removed a stray
back matter marker from the text.  (Thanks to Mark Atwood.)</t>
</list></t>

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

<t><list style="symbols">
  <t>Listed <spanx style="verb">chunks</spanx> as a requestable Blob/get property and fixed the
chunks example to request it.</t>
  <t>Explained the purpose of the DataSourceObject <spanx style="verb">position</spanx> property.</t>
  <t>Servers that do not store blobs in chunks return a single chunk
covering the whole blob.</t>
  <t>Added a Blob/lookup example.</t>
  <t>Extended acknowledgements.</t>
</list></t>

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

<t><list style="symbols">
  <t>Added per-account <spanx style="verb">uploadUrl</spanx> capability property, allowing
servers to direct uploads for individual accounts to a different
endpoint.  Uploads to this URL return an <spanx style="verb">expires</spanx> property in
addition to the standard upload response fields.</t>
  <t>Blob/set is now a standard Foo/set method with state strings
(ifInState/oldState/newState).  Renamed UploadObject to
BlobCreateObject.  The <spanx style="verb">expires</spanx> property can be set via update.</t>
  <t>Removed hardcoded type value lists from normative text (supportedArchiveTypes,
supportedCompressTypes, supportedDeltaTypes, ArchiveRecipe, CompressRecipe).
Values are now described as media types per <xref target="MEDIA-TYPES"/>.  Format-specific
considerations subsections remain as informative examples.</t>
  <t>Obsoletes RFC9404: incorporated all content from RFC9404 into
this document, making it self-contained.</t>
  <t>Renamed Blob/upload to Blob/set, making it a standard Foo/set
operation with create, update, and destroy at the top level.</t>
  <t>Added <spanx style="verb">urn:ietf:params:jmap:blob</spanx> capability definition (previously
defined only in RFC9404).</t>
  <t>Added Blob/lookup method (previously defined only in RFC9404).</t>
  <t>Added full DataSourceObject definition (merging RFC9404 base
definition with blobext extensions).</t>
  <t>Added full Blob/get definition (merging RFC9404 base definition
with blobext extensions).</t>
  <t>Added inline blob creation example.</t>
  <t>Updated IANA section to include blob capability, unknownDataType
error code, and JMAP Data Types registry.</t>
</list></t>

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

<t><list style="symbols">
  <t>No changes, just uploading with the new name</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-06</strong></t>

<t><list style="symbols">
  <t>Removed resumableUploadUrl capability property.</t>
  <t>Added isIncomplete and description response properties for
partial conversion results.</t>
  <t>Added conversionFailed error code for total conversion failure.</t>
  <t>Made expires always present (null if indeterminate) rather than
optional.</t>
  <t>Split supportedImageTypes into supportedImageReadTypes and
supportedImageWriteTypes.</t>
  <t>Made all supported type lists nullable (null = not supported).</t>
  <t>Changed imageData duration from UnsignedInt to Number for
sub-second precision.</t>
  <t>Clarified imageData comment as read-only.</t>
  <t>Added EXIF orientation reference and digest algorithm registry
reference.</t>
  <t>Fixed grammar and consistent error ordering across recipes.</t>
  <t>Structural reorder: DataSourceObject before Blob/get, ArchiveEntry
promoted to peer section.</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-05</strong></t>

<t><list style="symbols">
  <t>Added imageData property to Blob/get for image/video metadata
extraction (dimensions, orientation, date, GPS, duration).</t>
  <t>Renamed UnArchiveRecipe to ExtractRecipe and UnCompressRecipe
to DecompressRecipe.</t>
  <t>Split capability lists into separate create/extract pairs:
supportedArchiveTypes/supportedExtractTypes,
supportedCompressTypes/supportedDecompressTypes,
supportedDeltaTypes/supportedPatchTypes.</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-04</strong></t>

<t><list style="symbols">
  <t>Moved noPersist from top-level Blob/upload property to per-item
in the create map, for consistency with Blob/convert.</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-03</strong></t>

<t><list style="symbols">
  <t>Added update (touch) and destroy operations to Blob/upload.</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-02</strong></t>

<t><list style="symbols">
  <t>Replaced RdiffRecipe with generic DeltaRecipe and PatchRecipe using
media types (rdiff, bsdiff, unified diff).</t>
  <t>Replaced supportsRdiff with supportedPatchTypes capability.</t>
  <t>Clarified chunkSize as a hint, not a definitive statement.</t>
  <t>Added lazy generation text for Blob/convert (deferred output).</t>
  <t>Defined "expires" response property for blob creation responses.</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-01</strong></t>

<t><list style="symbols">
  <t>Added Blob/convert method with recipes for image conversion, archiving,
compression, and rdiff.</t>
  <t>Added noPersist option to Blob/upload and Blob/convert for ephemeral
intermediate blobs in pipelines.</t>
  <t>Removed rdiffSignature and rdiffPatch from Blob/get and DataSourceObject.</t>
  <t>Fleshed out capability object with supported type lists.</t>
  <t>Added capability and method examples.</t>
  <t>Expanded Security Considerations.</t>
  <t>Updated IANA registrations with error codes and corrected capability URI.</t>
  <t>Added limit capability properties: maxConvertSize, maxArchiveEntries,
maxImageDimension, and supportsRdiff.</t>
  <t>Added dependency resolution requirement for Blob/convert create map
with cycle detection.</t>
  <t>Now updates both RFC 8620 and RFC 9404.</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-00</strong></t>

<t><list style="symbols">
  <t>initial proposal</t>
</list></t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The authors would like to thank Mauro De Gennaro, Ben Bucksch,
Ricardo Signes, Neil Jenkins, Ken Murchison, Arnt Gulbrandsen,
Seph Gentle, Matthew Horsfall, Mark Atwood, and the members of the JMAP Working Group at the
IETF for their contributions and feedback.</t>

</section>


  </middle>

  <back>


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

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



<reference anchor="JMAP-CORE">
  <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="MEDIA-TYPES">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</reference>

<reference anchor="BASE64">
  <front>
    <title>The Base16, Base32, and Base64 Data Encodings</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <date month="October" year="2006"/>
    <abstract>
      <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4648"/>
  <seriesInfo name="DOI" value="10.17487/RFC4648"/>
</reference>

<reference anchor="DIGEST-FIELDS">
  <front>
    <title>Digest Fields</title>
    <author fullname="R. Polli" initials="R." surname="Polli"/>
    <author fullname="L. Pardue" initials="L." surname="Pardue"/>
    <date month="February" year="2024"/>
    <abstract>
      <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
      <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9530"/>
  <seriesInfo name="DOI" value="10.17487/RFC9530"/>
</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="IANA-GUIDELINES">
  <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="JMAP-MAIL">
  <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="JMAP-BLOB">
  <front>
    <title>JSON Meta Application Protocol (JMAP) Blob Management Extension</title>
    <author fullname="B. Gondwana" initials="B." role="editor" surname="Gondwana"/>
    <date month="August" year="2023"/>
    <abstract>
      <t>The JSON Meta Application Protocol (JMAP) base protocol (RFC 8620) provides the ability to upload and download arbitrary binary data via HTTP POST and GET on a defined endpoint. This binary data is called a "blob".</t>
      <t>This extension adds additional ways to create and access blobs by making inline method calls within a standard JMAP request.</t>
      <t>This extension also adds a reverse lookup mechanism to discover where blobs are referenced within other data types.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9404"/>
  <seriesInfo name="DOI" value="10.17487/RFC9404"/>
</reference>


<reference anchor="EXIF" >
  <front>
    <title>Exchangeable image file format for digital still cameras: Exif Version 3.0</title>
    <author >
      <organization>Camera &amp; Imaging Products Association</organization>
    </author>
    <date year="2023" month="May"/>
  </front>
  <seriesInfo name="CIPA" value="DC-008-2023"/>
</reference>


    </references>

</references>



  </back>

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

-->

</rfc>

