<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
<xep xmlns=""><header>
<title>Message Archive Management: Trim Command</title>
<abstract>This specification describes how a client can request "trimming" of an archive</abstract>

<legal>
<copyright>This XMPP Extension Protocol is copyright © 1999 – 2024 by the <link url="https://xmpp.org/">XMPP Standards Foundation</link> (XSF).</copyright>
<permissions>Permission is hereby granted, free of charge, to any person obtaining a copy of this specification (the "Specification"), to make use of the Specification without restriction, including without limitation the rights to implement the Specification in a software program, deploy the Specification in a network service, and copy, modify, merge, publish, translate, distribute, sublicense, or sell copies of the Specification, and to permit persons to whom the Specification is furnished to do so, subject to the condition that the foregoing copyright notice and this permission notice shall be included in all copies or substantial portions of the Specification. Unless separate permission is granted, modified works that are redistributed shall not contain misleading information regarding the authors, title, number, or publisher of the Specification, and shall not claim endorsement of the modified works by the authors, any organization or project to which the authors belong, or the XMPP Standards Foundation.</permissions>
<warranty>## NOTE WELL: This Specification is provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. ##</warranty>
<liability>In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall the XMPP Standards Foundation or any author of this Specification be liable for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising from, out of, or in connection with the Specification or the implementation, deployment, or other use of the Specification (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if the XMPP Standards Foundation or such author has been advised of the possibility of such damages.</liability>
<conformance>This XMPP Extension Protocol has been contributed in full conformance with the XSF's Intellectual Property Rights Policy (a copy of which can be found at &lt;<link url="https://xmpp.org/about/xsf/ipr-policy">https://xmpp.org/about/xsf/ipr-policy</link>&gt; or obtained by writing to XMPP Standards Foundation, P.O. Box 787, Parker, CO 80134 USA).</conformance>
</legal>
<number>xxxx</number>
<status>ProtoXEP</status>
<type>Standards Track</type>
<sig>Standards</sig>
<approver>Council</approver>
<dependencies/>
<supersedes/>
<supersededby/>
<shortname>mamtrim</shortname>

  <author>
    <firstname>Matthew</firstname>
    <surname>Wild</surname>
    <email>mwild1@gmail.com</email>
    <jid>me@matthewwild.co.uk</jid>
  </author>

<revision>
<version>0.0.1</version>
<date>2026-03-31</date>
<initials>mjw</initials>
<remark>
</remark>
</revision>
</header>
<section1 topic="Introduction" anchor="intro">

<p>The XMPP ecosystem has standardized around <span class="ref"><link url="https://xmpp.org/extensions/xep-0313.html">Message Archive Management (XEP-0313)</link></span> <note>XEP-0313: Message Archive Management &lt;<link url="https://xmpp.org/extensions/xep-0313.html">https://xmpp.org/extensions/xep-0313.html</link>&gt;.</note> for incoming and outgoing
message synchronization. Messages are stored in the archive for a period of
time, so they can be fetched by all receiving devices. However, the retention
of messages is typically controlled purely by the configuration of the server,
typically as a fixed period of time.</p>

<p>This specification defines a protocol that allows a client to request
"trimming" of an archive’s contents on-demand.</p>

</section1><section1 topic="Requirements" anchor="reqs">

<ul>
<li>Allow a client to request trimming of archive items before a certain point</li>
<li>Allow deletion of the entire archive</li>
</ul>

<section2 topic="Intended use cases" anchor="intended-use-cases">

<p>This protocol is designed for on-demand use cases, such as when a user
explicitly requests purging all messages from the archive. It is not designed
for automated client-side enforcement of a general retention policy (e.g.
implementing a user preference that the archive should contain no more than 30
days of messages). Such a feature would be far better implemented with a
server-side enforcement approach, which would allow all clients to discover
and agree on a policy, and function even when clients are offline.</p>

</section2></section1><section1 topic="Use Cases" anchor="usecases">

<section2 topic="Discovering support" anchor="discovering-support">

<p>Servers supporting and allowing this operation MUST advertise the service discovery feature 'urn:xmpp:mamtrim:0'.</p>

<p>If a deployment is configured to disallow trimming (e.g. because of legal or
audit requirements to preserve messages), the feature SHOULD NOT be advertised
to clients.</p>

</section2><section2 topic="Trimming the archive" anchor="trimming-the-archive">

<p>If supported by the server, clients may request for an archive to be 'trimmed' - this means immediate removal of all archived stanzas up to, and including, a specified UID. To ensure archive integrity, it is not possible to remove items from the "middle" or end of an archive.</p>

<p>To request trimming, a client sends an &lt;iq/&gt; of type 'set' to the archive, containing a &lt;trim/&gt; element qualified by the 'urn:xmpp:mamtrim:0' namespace.</p>

<p>An empty &lt;trim/&gt; element requests the deletion of all currently-archived stanzas. Alternatively, the element may contain a single &lt;id/&gt; element which, as character data, specifies the archive UID of an item to trim, along with all older items.</p>

<example caption="Requesting trim"><![CDATA[<iq type='set' id='gIgQj65M'>
  <trim xmlns='urn:xmpp:mamtrim:0'>
    <id>e5c258ec-2ce4-11f1-841f-507b9dcf344f</id>
  </trim>
</iq>]]></example>

<p>On success, the server returns an empty iq result:</p>

<example caption="Server returns trim success"><![CDATA[<iq type='result' id='gIgQj65M'></iq>]]></example>

<p>Alternatively, the server returns an appropriate error.</p>

</section2></section1><section1 topic="Business Rules" anchor="rules">

<p>Servers MUST only allow trimming requests from archive owners. For per-user archives, this means the account owner. For group chat archives, this typically means the owner(s) of the group chat.</p>

</section1><section1 topic="Accessibility Considerations" anchor="access">

<p>None.</p>

</section1><section1 topic="Security Considerations" anchor="security">

<p>None.</p>

</section1><section1 topic="Privacy Considerations" anchor="privacy">

<p>None.</p>

</section1><section1 topic="IANA Considerations" anchor="iana">

<p>None.</p>

</section1><section1 topic="XMPP Registrar Considerations" anchor="registrar">
<section2 topic="Protocol Namespaces" anchor="registrar-ns">
    <p>This specification defines the following XML namespace:</p>
    <ul>
      <li>urn:xmpp:mamtrim:0</li>
    </ul>
    <p>Upon advancement of this specification from a status of Experimental to a status of Draft, the <span class="ref"><link url="https://xmpp.org/registrar/">XMPP Registrar</link></span> <note>The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &lt;<link url="https://xmpp.org/registrar/">https://xmpp.org/registrar/</link>&gt;.</note> shall add the foregoing namespace to the registry located at &lt;<link url="https://xmpp.org/registrar/namespaces.html">https://xmpp.org/registrar/namespaces.html</link>&gt;, as described in Section 4 of <span class="ref"><link url="https://xmpp.org/extensions/xep-0053.html">XMPP Registrar Function (XEP-0053)</link></span> <note>XEP-0053: XMPP Registrar Function &lt;<link url="https://xmpp.org/extensions/xep-0053.html">https://xmpp.org/extensions/xep-0053.html</link>&gt;.</note>.</p>
  </section2>

</section1><section1 topic="Design Considerations" anchor="design-considerations">

<p>There were some options for how to specify the cut-off point for trimming:</p>

<ul>
<li>Date/time</li>
<li>ID</li>
</ul>

<p>Both of these can be inclusive (remove items including any with the specified
timestamp or ID) or exclusive (keep the referenced item, but remove earlier
items).</p>

<p>The protocol uses IDs, because it is more precise than timestamps, and the
trim operation is inclusive of the referenced ID. This is because a common
operation is expected to be "trim everything I have received", and this allows
a client to pass the latest ID they have received. This prevents a race
condition in "delete everything" where an incoming message could arrive after
the client sent the request.</p>

</section1><section1 topic="XML Schema" anchor="schema">

<p>TDB.</p>
</section1>
</xep>
