<remark>Accepted by vote of Council on 2022-02-09.</remark>
</revision>
<revision>
<version>0.0.1</version>
<date>2022-02-01</date>
<initials>edhelas, pep</initials>
<remark><p>First draft.</p></remark>
</revision>
</header>
<section1anchor="intro"topic="Introduction">
<p>Implementations have been able to declare a <tt>pubsub#type</tt> attribute on PubSub nodes for about as long as &xep0060; has existed. This attribute doesn’t seem to be widely used in the community though, maybe due to the vagueness of its description, that has recently changed, or the lack of features associated with it.</p>
<p>Filtering is particularly useful for example combined with &xep0277; and comment nodes that are created on the same service. When listing content nodes of a service, one may want to filter out comment nodes.</p>
</section1>
<section1anchor="reqs"topic="Requirements">
<ul>
<li>Allow querying only a subset of nodes in a disco items request, in the form of include/exclude</li>
<p>A service implementing this specification MUST advertize through &xep0030; a <tt>urn:xmpp:pubsub-filter:0</tt> feature.</p>
</section2>
<section2anchor="sending-a-disco-request"topic="Sending a disco request">
<p>While requesting disco#items on a PubSub service, an entity might want to only get nodes of certain <tt>pubsub#type</tt>. To do so, it may add a filter child of namespace <tt>urn:xmpp:pubsub-filter:0</tt> to the query element, containing a &xep0004; form with FORM_TYPE set to <tt>urn:xmpp:pubsub-filter:0</tt> and an <tt>included-types</tt> or <tt>excluded-types</tt> list-multi type field containing the various types it wants to filter.</p>
<p>When <tt>included-types</tt> is specified, a PubSub service MUST return nodes of matching <tt>pubsub#type</tt> in its response.</p>
<p>When <tt>excluded-types</tt> is specified, a PubSub service MUST return every node but those of matching <tt>pubsub#types</tt> in its response.</p>
<p>Both included and excluded fields MAY contain an empty value to designate nodes with an empty <tt>pubsub#type</tt>.</p>
<examplecaption='Requesting disco#items with only nodes of the following types, including empty ones'><![CDATA[<iqtype='get'
<p>If both the included and excluded fields are specified, a service MUST return an error of type <tt>modify</tt> containing a <tt>bad-request</tt> element in the <tt>urn:ietf:params:xml:ns:xmpp-stanzas</tt> namespace.</p>
<examplecaption='Error returned when a requesting entity includes both fields'><![CDATA[<iqtype='error'