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


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

]>


<rfc ipr="trust200902" docName="draft-degennaro-mta-hooks-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="MTA Hooks">MTA Hooks: An HTTP-Based Mail Processing Protocol</title>

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

    <date year="2026" month="May" day="08"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 44?>

<t>This document specifies MTA Hooks, an HTTP-based protocol enabling Mail Transfer Agents (MTAs) to delegate message processing decisions to external services. MTA Hooks provides a modern alternative to legacy mail filtering protocols by leveraging ubiquitous HTTP infrastructure, supporting both JSON and CBOR serialization, and offering fine-grained capability negotiation. The protocol supports both inbound message reception and outbound message delivery scenarios, allowing external scanners to inspect messages, modify content, and influence routing decisions at various stages of mail processing.</t>



    </abstract>



  </front>

  <middle>


<?line 48?>

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

<t>Mail Transfer Agents require extensible mechanisms to integrate with external services for spam filtering, virus scanning, policy enforcement, and compliance monitoring. While legacy protocols such as the Milter protocol have served this purpose, they present challenges in modern deployments including proprietary wire formats, limited tooling, and operational complexity.</t>

<t>MTA Hooks addresses these challenges by defining an HTTP-based protocol for mail processing delegation. The protocol leverages the widespread availability of HTTP client and server implementations, standard serialization formats, and established operational practices for HTTP services.</t>

<t>MTA Hooks achieves broad deployment compatibility by building upon standard HTTP semantics and methods, allowing implementers to leverage existing HTTP client and server libraries. The protocol supports both JSON and CBOR serialization to accommodate environments with different performance and parsing requirements. Capability negotiation during registration enables graceful feature discovery and forward compatibility as the protocol evolves. Mandatory transport encryption protects message content in transit, while the authentication mechanism remains pluggable to integrate with diverse deployment environments. The HTTP foundation ensures compatibility with existing operational infrastructure including load balancers, reverse proxies, and monitoring systems.</t>

<t>MTA Hooks supports two primary use cases: inbound processing during message reception from remote clients, and outbound processing during message delivery to remote servers. Both scenarios follow a consistent request-response pattern where the MTA invokes the registered hook endpoints at configured processing stages.</t>

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

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>The following terms are used throughout this document:</t>

<t><list style="symbols">
  <t>MTA (Mail Transfer Agent): A software component responsible for transferring electronic mail messages between hosts, as described in <xref target="RFC5321"/>.</t>
  <t>Hook Endpoint: An HTTP server endpoint that receives hook invocations from an MTA and returns processing instructions.</t>
  <t>Scanner: A service that registers with an MTA to receive hook invocations. Scanners perform functions such as spam filtering, virus scanning, or policy enforcement. The terms "scanner" and "hook endpoint" are used interchangeably when referring to the service receiving hook requests.</t>
  <t>Registration: The process by which an MTA establishes a session with a scanner, including capability negotiation and assignment of a registration identifier.</t>
  <t>Inbound Processing: Hook invocation during message reception, when the MTA accepts a message from a remote SMTP client.</t>
  <t>Outbound Processing: Hook invocation during message delivery, when the MTA transmits a message to a remote SMTP server.</t>
  <t>Stage: A specific point in mail processing at which the MTA invokes registered hooks. Different stages provide access to different message properties.</t>
  <t>Action: An instruction from a scanner indicating how the MTA should proceed with message processing.</t>
  <t>Modification: A change to message properties requested by a scanner, expressed as operations on the hook request object.</t>
</list></t>

</section>
<section anchor="data-types"><name>Data Types</name>

<t>This specification defines several object types used throughout the protocol. The following primitive types are used:</t>

<dl newline="true">
  <dt><strong>String</strong></dt>
  <dd>
    <t>A JSON string value.</t>
  </dd>
  <dt><strong>Int</strong></dt>
  <dd>
    <t>An integer in the range -2^53+1 &lt;= value &lt;= 2^53-1.</t>
  </dd>
  <dt><strong>UnsignedInt</strong></dt>
  <dd>
    <t>An integer in the range 0 &lt;= value &lt;= 2^53-1.</t>
  </dd>
  <dt><strong>Boolean</strong></dt>
  <dd>
    <t>A JSON boolean value (true or false).</t>
  </dd>
  <dt><strong>UTCDate</strong></dt>
  <dd>
    <t>A string in "date-time" format as defined in <xref target="RFC3339"/>, where the time-offset component <bcp14>MUST</bcp14> be "Z" (UTC time). For example, "2024-12-21T15:30:00Z".</t>
  </dd>
</dl>

</section>
</section>
<section anchor="protocol-overview"><name>Protocol Overview</name>

<t>MTA Hooks defines a request-response protocol where the MTA acts as an HTTP client and scanners act as HTTP servers. During mail processing, the MTA constructs a request containing message properties and context information, transmits it to registered scanner endpoints, and processes the response to determine subsequent actions.</t>

<section anchor="architecture"><name>Architecture</name>

<t>The protocol architecture consists of three primary components:</t>

<t><list style="numbers" type="1">
  <t>The MTA, which initiates HTTP requests to scanner endpoints at configured processing stages.</t>
  <t>Scanner services, which receive requests, perform analysis, and return responses containing actions and modifications.</t>
  <t>A registration mechanism through which the MTA declares its intent to send specific stages and properties and the scanner returns a registration identifier used on subsequent invocations.</t>
</list></t>

<figure title="MTA Hooks Protocol Flow" anchor="fig-architecture"><artwork><![CDATA[
+-------+                              +---------+
|       |  1. Discovery Request        |         |
|       |----------------------------->|         |
|       |  2. Discovery Response       |         |
|       |<-----------------------------|         |
|       |                              |         |
|       |  3. Registration Request     |         |
|  MTA  |----------------------------->| Scanner |
|       |  4. Registration Response    |         |
|       |<-----------------------------|         |
|       |                              |         |
|       |  5. Hook Request             |         |
|       |----------------------------->|         |
|       |  6. Hook Response            |         |
|       |<-----------------------------|         |
+-------+                              +---------+
]]></artwork></figure>

<t>The protocol flow proceeds as follows:</t>

<t><list style="numbers" type="1">
  <t>The MTA discovers scanner capabilities by requesting the well-known discovery endpoint.</t>
  <t>The scanner returns a discovery document describing supported stages, actions, and configuration options.</t>
  <t>The MTA submits a registration request to the scanner specifying the stages, properties, and filters it will deliver.</t>
  <t>The scanner validates the request, returns a registration identifier, and confirms the negotiated capabilities.</t>
  <t>During mail processing, the MTA invokes the scanner's hook endpoint with message properties and context.</t>
  <t>The scanner returns a response containing an action and optional modifications.</t>
</list></t>

</section>
<section anchor="serialization"><name>Serialization</name>

<t>Requests and responses are serialized using either JSON <xref target="RFC8259"/> or CBOR <xref target="RFC8949"/>. The serialization format is negotiated during registration and indicated via HTTP <spanx style="verb">Content-Type</spanx> headers.</t>

<t>For JSON serialization, the <spanx style="verb">Content-Type</spanx> header <bcp14>MUST</bcp14> be "application/json". For CBOR serialization, the <spanx style="verb">Content-Type</spanx> header <bcp14>MUST</bcp14> be "application/cbor".</t>

<t>Binary data handling differs between formats. In JSON serialization, binary content such as message body parts <bcp14>MUST</bcp14> be encoded using Base64. In CBOR serialization, binary content <bcp14>SHOULD</bcp14> be transmitted as raw byte strings.</t>

</section>
<section anchor="processing-stages"><name>Processing Stages</name>

<t>MTA Hooks defines processing stages for both inbound and outbound message handling. Scanners subscribe to specific stages during registration and receive invocations only for subscribed stages.</t>

<section anchor="inbound-stages"><name>Inbound Stages</name>

<t>Inbound stages correspond to SMTP protocol events during message reception:</t>

<t><list style="symbols">
  <t>connect: Invoked when a remote client establishes a connection, before any SMTP commands are exchanged.</t>
  <t>ehlo: Invoked after the client sends EHLO or HELO command.</t>
  <t>mail: Invoked after each MAIL FROM command.</t>
  <t>rcpt: Invoked after each RCPT TO command. This stage may be invoked multiple times per transaction.</t>
  <t>data: Invoked after the complete message has been received, following the DATA command and message content.</t>
</list></t>

</section>
<section anchor="outbound-stages"><name>Outbound Stages</name>

<t>Outbound stages correspond to delivery events during message transmission:</t>

<t><list style="symbols">
  <t>delivery: Invoked after a delivery attempt completes for all recipients, regardless of success or failure.</t>
  <t>defer: Invoked only when at least one recipient delivery cannot be completed and requires retry.</t>
  <t>dsn: Invoked when the MTA generates a Delivery Status Notification of any type.</t>
</list></t>

<t>For outbound stages, the hook is invoked once after delivery attempts for all recipients in a given delivery batch have completed. The scanner receives the delivery status for each recipient and may modify per-recipient handling.</t>

</section>
</section>
<section anchor="inbound-message-processing"><name>Inbound Message Processing</name>

<t>During inbound processing, the MTA invokes registered hooks as it receives messages from remote SMTP clients. This corresponds to traditional mail filtering scenarios where external services inspect incoming mail for spam, viruses, or policy violations.</t>

<t>The inbound flow proceeds through SMTP protocol stages:</t>

<t><list style="numbers" type="1">
  <t>A remote client connects to the MTA.</t>
  <t>The MTA invokes hooks registered for the "connect" stage.</t>
  <t>The client sends EHLO/HELO; the MTA invokes "ehlo" stage hooks.</t>
  <t>The client sends MAIL FROM; the MTA invokes "mail" stage hooks.</t>
  <t>The client sends one or more RCPT TO commands; the MTA invokes "rcpt" stage hooks for each.</t>
  <t>The client sends DATA and message content; the MTA invokes "data" stage hooks.</t>
</list></t>

<t>At each stage, scanners may instruct the MTA to accept, reject, or modify the transaction.</t>

<section anchor="multiple-scanner-handling"><name>Multiple Scanner Handling</name>

<t>When multiple scanners are registered for the same stage, the MTA invokes them sequentially in an implementation-defined order. Each scanner's response affects the request seen by subsequent scanners.</t>

<t>The scanner chain terminates early when a scanner returns a terminal action:</t>

<t><list style="symbols">
  <t>Inbound terminal actions: "reject", "discard", "disconnect"</t>
  <t>Outbound terminal actions: "cancel"</t>
</list></t>

<t>Non-terminal actions ("accept", "quarantine" for inbound; "continue" for outbound) allow the chain to proceed. Each scanner sees the prior scanner's modifications, including any change to the "/action" path, and <bcp14>MAY</bcp14> further modify it.</t>

<t>Action precedence within a chain proceeds from least to most restrictive: "accept" is the weakest, "quarantine" is stronger, and the terminal actions ("reject", "discard", "disconnect") are the strongest. By default, the MTA <bcp14>SHOULD</bcp14> reject responses that downgrade the action to a weaker value (for example, setting "/action" from "quarantine" to "accept"). Implementations <bcp14>MAY</bcp14> provide configuration to permit such downgrades for specific trusted scanners, but this <bcp14>MUST NOT</bcp14> be the default.</t>

<t>Implementations <bcp14>SHOULD</bcp14> provide configuration options for:</t>

<t><list style="symbols">
  <t>Scanner invocation order (priority-based or explicit ordering)</t>
  <t>Per-scanner trust to permit action downgrades</t>
  <t>Logging of chain termination events for operational visibility</t>
</list></t>

<t>Example chain behavior:</t>

<t><list style="numbers" type="1">
  <t>Scanner A (spam filter) sets action to "accept" and adds X-Spam-Score header</t>
  <t>Scanner B (virus scanner) receives modified request, detects malware, sets action to "reject"</t>
  <t>Chain terminates; Scanner C is not invoked</t>
  <t>MTA rejects the message</t>
</list></t>

</section>
</section>
<section anchor="outbound-message-processing"><name>Outbound Message Processing</name>

<t>During outbound processing, the MTA invokes registered hooks as it delivers messages to remote SMTP servers. This supports use cases including delivery logging, compliance monitoring, and routing decisions.</t>

<t>The outbound flow proceeds as follows:</t>

<t><list style="numbers" type="1">
  <t>The MTA selects a queued message for delivery and identifies the recipients due for delivery at this time.</t>
  <t>The MTA attempts delivery to all selected recipients.</t>
  <t>After all attempts in this delivery job complete, the MTA invokes hooks registered for the "delivery" stage.</t>
  <t>If any recipient requires retry, the MTA invokes "defer" stage hooks.</t>
  <t>If the MTA generates a DSN, it invokes "dsn" stage hooks before sending.</t>
</list></t>

<t>A delivery job represents a single processing cycle where the MTA retrieves a message from the queue and attempts delivery to one or more recipients. The specific batching of recipients into delivery jobs is implementation-defined and may depend on factors such as destination domain, connection reuse, or queue configuration. The "delivery" stage hook is invoked once per delivery job after all recipient attempts within that job have completed.</t>

<t>Scanners may modify per-recipient delivery status, suppress DSN generation, or alter retry scheduling.</t>

</section>
<section anchor="modifications"><name>Modifications</name>

<t>Scanners communicate changes through modifications to the hook request object, expressed as set, add, and delete operations on JSON Pointers <xref target="RFC6901"/>. The complete modification semantics, including operation ordering and error handling, are defined in <xref target="hook-response"/>.</t>

</section>
</section>
<section anchor="discovery"><name>Discovery</name>

<t>MTAs discover scanner capabilities through a well-known HTTP endpoint. Discovery is <bcp14>OPTIONAL</bcp14>; scanner endpoints <bcp14>MAY</bcp14> alternatively be configured manually.</t>

<section anchor="well-known-endpoint"><name>Well-Known Endpoint</name>

<t>Scanners that support discovery <bcp14>MUST</bcp14> expose a discovery document at the path "/.well-known/mta-hooks". The MTA retrieves this document using an HTTP GET request.</t>

<t>The discovery endpoint <bcp14>MUST</bcp14> support JSON serialization. Support for CBOR serialization is <bcp14>OPTIONAL</bcp14>.</t>

</section>
<section anchor="discovery-document-format"><name>Discovery Document Format</name>

<t>The discovery document is a JSON or CBOR object containing the following fields:</t>

<dl newline="true">
  <dt><strong>version</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The protocol version. This specification defines version "1.0".</t>
  </dd>
  <dt><strong>endpoints</strong>: <spanx style="verb">DiscoveryEndpoints</spanx></dt>
  <dd>
    <t>URLs for protocol operations.</t>
  </dd>
  <dt><strong>serialization</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>Supported serialization formats. Valid values are "json" and "cbor".</t>
  </dd>
  <dt><strong>capabilities</strong>: <spanx style="verb">DiscoveryCapabilities</spanx></dt>
  <dd>
    <t>Supported protocol capabilities.</t>
  </dd>
  <dt><strong>limits</strong>: <spanx style="verb">DiscoveryLimits|null</spanx></dt>
  <dd>
    <t>Operational limits, or null if no specific limits are advertised.</t>
  </dd>
  <dt><strong>extensions</strong>: <spanx style="verb">String[]|null</spanx></dt>
  <dd>
    <t>Supported protocol extensions. Extension identifiers <bcp14>SHOULD</bcp14> use a reverse domain name prefix for vendor-specific extensions.</t>
  </dd>
</dl>

<t>A <strong>DiscoveryEndpoints</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>registration</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>URL path for submitting registration requests.</t>
  </dd>
  <dt><strong>deregistration</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>URL path template for deregistration, with "{registration_id}" placeholder.</t>
  </dd>
</dl>

<t>A <strong>DiscoveryCapabilities</strong> object has the following properties:</t>

<dl>
  <dt><strong>inbound</strong>: <spanx style="verb">DirectionCapabilities|null</spanx></dt>
  <dd>
    <t>Inbound processing capabilities, or null if inbound processing is not supported.</t>
  </dd>
  <dt><strong>outbound</strong>: <spanx style="verb">DirectionCapabilities|null</spanx></dt>
  <dd>
    <t>Outbound processing capabilities, or null if outbound processing is not supported.</t>
  </dd>
</dl>

<t>A <strong>DirectionCapabilities</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>stages</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>Supported stages for this processing direction.</t>
  </dd>
  <dt><strong>actions</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>Supported actions that scanners may request.</t>
  </dd>
  <dt><strong>fetchProperties</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>JSON Pointers for properties the MTA can include in hook requests.</t>
  </dd>
  <dt><strong>updateProperties</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>JSON Pointers for properties scanners may modify.</t>
  </dd>
</dl>

<t>A <strong>DiscoveryLimits</strong> object has the following properties:</t>

<dl>
  <dt><strong>maxMessageSize</strong>: <spanx style="verb">UnsignedInt|null</spanx></dt>
  <dd>
    <t>Maximum message size in bytes the scanner accepts.</t>
  </dd>
  <dt><strong>maxRegistrations</strong>: <spanx style="verb">UnsignedInt|null</spanx></dt>
  <dd>
    <t>Maximum concurrent registrations.</t>
  </dd>
  <dt><strong>timeoutMs</strong>: <spanx style="verb">UnsignedInt|null</spanx></dt>
  <dd>
    <t>Default timeout in milliseconds for hook invocations.</t>
  </dd>
</dl>

<t>The <spanx style="verb">fetchProperties</spanx> and <spanx style="verb">updateProperties</spanx> arrays contain JSON Pointers as defined in <xref target="RFC6901"/>.  Each pointer identifies a property within
the hook request structure that the MTA supports including or that scanners may modify. For example, "/envelope/from/address" refers to the sender's email address within the envelope object.</t>

<section anchor="example-discovery-document"><name>Example Discovery Document</name>

<figure><sourcecode type="json"><![CDATA[
{
  "version": "1.0",

  "endpoints": {
    "registration": "/v1/hooks/register",
    "deregistration": "/v1/hooks/register/{registration_id}"
  },

  "serialization": ["json", "cbor"],

  "capabilities": {
    "inbound": {
      "stages": ["connect", "ehlo", "mail", "rcpt", "data"],
      "actions": ["accept", "reject", "discard",
                  "quarantine", "disconnect"],
      "fetchProperties": ["/envelope", "/message", "/rawMessage",
                          "/server", "/tls", "/auth", "/senderAuth",
                          "/client", "/stage", "/action", 
                          "/timestamp","/response", "/protocol", 
                          "/queue"],
      "updateProperties": ["/envelope", "/message", "/rawMessage",
                           "/action", "/response"]
    },
    "outbound": {
      "stages": ["delivery", "defer", "dsn"],
      "actions": ["continue", "cancel"],
      "fetchProperties": ["/envelope", "/message", "/rawMessage",
                          "/server", "/queue", "/stage", "/action",
                          "/timestamp", "/protocol"],
      "updateProperties": ["/envelope/to", "/action", "/message",
                           "/rawMessage"]
    }
  },

  "limits": {
    "maxMessageSize": 52428800,
    "maxRegistrations": 64,
    "timeoutMs": 30000
  },

  "extensions": ["x-vendor-feature"]
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="manual-configuration"><name>Manual Configuration</name>

<t>Discovery is <bcp14>OPTIONAL</bcp14>. Administrators <bcp14>MAY</bcp14> configure scanner endpoints manually, including capability restrictions and authentication credentials. Manual configuration may be necessary in environments where the well-known endpoint is not accessible or where policy requires explicit configuration.</t>

</section>
</section>
<section anchor="registration"><name>Registration</name>

<t>The MTA registers with each configured scanner to negotiate capabilities and establish a session identifier used on subsequent hook invocations. Registration creates state at the scanner that remains active until explicit deregistration or expiration.</t>

<t>The MTA acts as the HTTP client throughout: it discovers scanner capabilities, submits the registration request, manages the lifecycle of the registration, and invokes hooks. The MTA does not expose any HTTP server for scanner-to-MTA communication. Scanner endpoints, credentials, and per-scanner subscription policy are provisioned at the MTA out of band; this specification does not define the provisioning channel.</t>

<section anchor="registration-request"><name>Registration Request</name>

<t>The MTA submits a registration request via HTTP POST to the registration endpoint advertised in the scanner's discovery document, or configured manually. The request body contains a JSON or CBOR object with the following fields:</t>

<dl newline="true">
  <dt><strong>name</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Human-readable name identifying the MTA instance, suitable for display in scanner administrative interfaces.</t>
  </dd>
  <dt><strong>version</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>MTA software version string.</t>
  </dd>
  <dt><strong>timeoutMs</strong>: <spanx style="verb">UnsignedInt|null</spanx></dt>
  <dd>
    <t>Hook invocation timeout the MTA will enforce, in milliseconds. The scanner <bcp14>MAY</bcp14> use this value to size internal queues and processing budgets, but it does not affect MTA behavior.</t>
  </dd>
  <dt><strong>expiresAt</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>Requested registration expiration timestamp. The scanner <bcp14>MAY</bcp14> assign a different expiration based on policy.</t>
  </dd>
  <dt><strong>serialization</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Requested serialization format for hook requests. <bcp14>MUST</bcp14> be a value from the scanner's advertised serialization list.</t>
  </dd>
  <dt><strong>inbound</strong>: <spanx style="verb">StageSubscription|null</spanx></dt>
  <dd>
    <t>Inbound hook configuration. Omit or set to null if not subscribing to inbound stages.</t>
  </dd>
  <dt><strong>outbound</strong>: <spanx style="verb">StageSubscription|null</spanx></dt>
  <dd>
    <t>Outbound hook configuration. Omit or set to null if not subscribing to outbound stages.</t>
  </dd>
  <dt><strong>filter</strong>: <spanx style="verb">FilterOperator|FilterCondition|null</spanx></dt>
  <dd>
    <t>Filter the MTA will apply locally before invoking the scanner. Disclosed for transparency so the scanner can interpret the message stream it receives. Uses filter syntax from <xref section="5.5" sectionFormat="of" target="RFC8620"/>.</t>
  </dd>
  <dt><strong>metadata</strong>: <spanx style="verb">String[String]|null</spanx></dt>
  <dd>
    <t>Arbitrary key-value pairs for operational metadata.</t>
  </dd>
</dl>

<t>A <strong>StageSubscription</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>stages</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>Stages to subscribe to. <bcp14>MUST</bcp14> be a subset of the MTA's supported stages for this direction.</t>
  </dd>
  <dt><strong>properties</strong>: <spanx style="verb">String[]|null</spanx></dt>
  <dd>
    <t>JSON Pointers specifying message properties to receive. A value of null requests all supported properties.</t>
  </dd>
</dl>

<t>At least one of "inbound" or "outbound" <bcp14>MUST</bcp14> be present and non-null in the registration request.</t>

<section anchor="filter-configuration"><name>Filter Configuration</name>

<t>The filter field uses the FilterOperator and FilterCondition syntax defined in <xref section="5.5" sectionFormat="of" target="RFC8620"/>. A FilterOperator combines multiple conditions using AND, OR, or NOT logic. A FilterCondition specifies criteria that a message must match.</t>

<t>Filter conditions follow <xref section="4.4.1" sectionFormat="of" target="RFC8621"/> with the following exclusions. The conditions listed below depend on mailbox state, thread state, or message-arrival timing not applicable to MTA processing, and are NOT supported:</t>

<t><list style="symbols">
  <t>inMailbox</t>
  <t>inMailboxOtherThan</t>
  <t>before</t>
  <t>after</t>
  <t>allInThreadHaveKeyword</t>
  <t>someInThreadHaveKeyword</t>
  <t>noneInThreadHaveKeyword</t>
  <t>hasKeyword</t>
  <t>notKeyword</t>
</list></t>

<t>All other filter conditions defined in <xref section="4.4.1" sectionFormat="of" target="RFC8621"/> are permitted by this specification, including text-matching conditions such as "from", "to", "cc", "bcc", "subject", "body", "header", and "text", and the size conditions "minSize" and "maxSize". However, support for specific conditions is determined by the scanner implementation. If the registration request specifies a filter condition that the scanner does not support, the registration <bcp14>MUST</bcp14> be rejected with an UNSUPPORTED_FILTER error.</t>

<t>The following additional conditions are defined for envelope filtering:</t>

<dl newline="true">
  <dt><strong>envelopeFrom</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Matches if the MAIL FROM address matches the given value. The value <bcp14>MAY</bcp14> include wildcards using the "*" character, which matches zero or more characters.</t>
  </dd>
  <dt><strong>envelopeTo</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Matches if any RCPT TO address matches the given value. The value <bcp14>MAY</bcp14> include wildcards using the "*" character, which matches zero or more characters.</t>
  </dd>
</dl>

<t>Filters apply only to the "data" stage for content-based conditions (those examining message headers or body). For the "mail" and "rcpt" stages, only envelopeFrom and envelopeTo conditions are evaluated; other conditions are ignored for these stages. Messages or envelope commands not matching the filter do not trigger hook invocations.</t>

</section>
<section anchor="example-registration-request"><name>Example Registration Request</name>

<figure><artwork><![CDATA[
POST /v1/hooks/register HTTP/1.1
Host: scanner.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

{
  "name": "Acme MTA mx1",
  "version": "2.1.0",

  "timeoutMs": 25000,

  "expiresAt": "2025-12-21T15:30:00Z",

  "serialization": "json",

  "inbound": {
    "stages": ["data"],
    "properties": ["/message", "/envelope", "/senderAuth"]
  },

  "outbound": {
    "stages": ["delivery"],
    "properties": null
  },

  "filter": {
    "operator": "OR",
    "conditions": [
      {"from": "*@external.example.com"},
      {"envelopeFrom": "*@partner.example.org"}
    ]
  },

  "metadata": {
    "operator": "acme-mail",
    "environment": "production",
    "instance": "mx1"
  }
}
]]></artwork></figure>

</section>
</section>
<section anchor="registration-response"><name>Registration Response</name>

<t>Upon successful registration, the scanner returns HTTP status 201 Created with a response body containing:</t>

<dl newline="true">
  <dt><strong>registrationId</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Unique identifier for this registration. The identifier <bcp14>MUST</bcp14> consist of ASCII alphanumeric characters plus hyphen (-), underscore (_), and colon (:), with a maximum length of 255 characters.</t>
  </dd>
  <dt><strong>status</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Registration status. Values are "active" or "suspended".</t>
  </dd>
  <dt><strong>createdAt</strong>: <spanx style="verb">UTCDate</spanx></dt>
  <dd>
    <t>Timestamp of registration creation.</t>
  </dd>
  <dt><strong>expiresAt</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>Timestamp when registration expires, or null if no expiration is set.</t>
  </dd>
  <dt><strong>hookEndpoint</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Absolute or relative URL where the MTA <bcp14>MUST</bcp14> send hook invocations for this registration. A relative URL is resolved against the registration endpoint URL. The scanner <bcp14>MAY</bcp14> return a different path per registration to multiplex tenants.</t>
  </dd>
  <dt><strong>negotiated</strong>: <spanx style="verb">NegotiatedCapabilities</spanx></dt>
  <dd>
    <t>Final negotiated capabilities representing the intersection of the MTA's request and the scanner's support.</t>
  </dd>
  <dt><strong>endpoints</strong>: <spanx style="verb">RegistrationEndpoints</spanx></dt>
  <dd>
    <t>URLs for managing this registration.</t>
  </dd>
</dl>

<t>A <strong>NegotiatedCapabilities</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>serialization</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Confirmed serialization format.</t>
  </dd>
  <dt><strong>inbound</strong>: <spanx style="verb">NegotiatedSubscription|null</spanx></dt>
  <dd>
    <t>Confirmed inbound configuration, or null if not registered for inbound processing.</t>
  </dd>
  <dt><strong>outbound</strong>: <spanx style="verb">NegotiatedSubscription|null</spanx></dt>
  <dd>
    <t>Confirmed outbound configuration, or null if not registered for outbound processing.</t>
  </dd>
</dl>

<t>A <strong>NegotiatedSubscription</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>stages</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>Confirmed stages.</t>
  </dd>
  <dt><strong>properties</strong>: <spanx style="verb">String[]</spanx></dt>
  <dd>
    <t>Confirmed property list.</t>
  </dd>
</dl>

<t>A <strong>RegistrationEndpoints</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>deregistration</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>URL for deregistration requests.</t>
  </dd>
  <dt><strong>status</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>URL for status queries.</t>
  </dd>
</dl>

<section anchor="example-registration-response"><name>Example Registration Response</name>

<figure><artwork><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json
Location: /v1/hooks/register/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d

{
  "registrationId": "reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d",
  "status": "active",
  "createdAt": "2024-12-21T15:30:00Z",
  "expiresAt": "2025-12-21T15:30:00Z",

  "hookEndpoint": "/v1/hooks/invoke/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d",

  "negotiated": {
    "serialization": "json",
    "inbound": {
      "stages": ["data"],
      "properties": ["/message", "/envelope", "/senderAuth"]
    },
    "outbound": {
      "stages": ["delivery"],
      "properties": ["/message", "/envelope", "/queue", "/server"]
    }
  },

  "endpoints": {
    "deregistration":
      "/v1/hooks/register/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d",
    "status":
      "/v1/hooks/register/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d/status"
  }
}
]]></artwork></figure>

</section>
</section>
<section anchor="registration-authentication"><name>Authentication</name>

<t>The MTA <bcp14>MUST</bcp14> authenticate to the scanner on every registration, status, and deregistration request. The same credentials are used for hook invocations (<xref target="hook-authentication"/>). The specific mechanism is out of scope for this specification; implementations <bcp14>SHOULD</bcp14> support at least one of:</t>

<t><list style="symbols">
  <t>Bearer tokens via the HTTP Authorization header</t>
  <t>Mutual TLS with client certificate verification</t>
  <t>HMAC-based pre-shared key authentication</t>
</list></t>

<t>Credentials are issued by the scanner operator to each MTA permitted to register, through an out-of-band provisioning channel. The scanner <bcp14>MUST</bcp14> verify the MTA's identity from the presented credentials and reject unauthenticated or unauthorized requests. See <xref target="security-considerations"/> for deployment guidance.</t>

</section>
<section anchor="registration-lifecycle"><name>Registration Lifecycle</name>

<section anchor="status-queries"><name>Status Queries</name>

<t>The MTA <bcp14>MAY</bcp14> query a registration's status via HTTP GET to the status endpoint returned during registration.</t>

<figure><artwork><![CDATA[
GET /v1/hooks/register/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d/status \
  HTTP/1.1
Host: scanner.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
]]></artwork></figure>

<t>The response contains registration status and optional statistics:</t>

<dl newline="true">
  <dt><strong>registrationId</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The registration identifier.</t>
  </dd>
  <dt><strong>status</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Current status: "active", "suspended", or "deregistered".</t>
  </dd>
  <dt><strong>createdAt</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>Timestamp of creation.</t>
  </dd>
  <dt><strong>expiresAt</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>Timestamp of expiration.</t>
  </dd>
  <dt><strong>lastInvocation</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>Timestamp of most recent hook invocation.</t>
  </dd>
  <dt><strong>statistics</strong>: <spanx style="verb">RegistrationStatistics|null</spanx></dt>
  <dd>
    <t>Operational statistics.</t>
  </dd>
  <dt><strong>health</strong>: <spanx style="verb">HealthStatus|null</spanx></dt>
  <dd>
    <t>Health check status.</t>
  </dd>
</dl>

<t>A <strong>RegistrationStatistics</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>invocations</strong>: <spanx style="verb">InvocationCounts</spanx></dt>
  <dd>
    <t>Invocation counts.</t>
  </dd>
  <dt><strong>errors</strong>: <spanx style="verb">InvocationCounts</spanx></dt>
  <dd>
    <t>Error counts with the same time period structure as invocations.</t>
  </dd>
  <dt><strong>averageResponseMs</strong>: <spanx style="verb">Number</spanx></dt>
  <dd>
    <t>Average response time in milliseconds.</t>
  </dd>
</dl>

<t>An <strong>InvocationCounts</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>total</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Total count since registration.</t>
  </dd>
  <dt><strong>last24h</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Count in past 24 hours.</t>
  </dd>
  <dt><strong>last7d</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Count in past 7 days.</t>
  </dd>
  <dt><strong>last30d</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Count in past 30 days.</t>
  </dd>
</dl>

<t>A <strong>HealthStatus</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>status</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Health status: "healthy", "degraded", or "unhealthy".</t>
  </dd>
  <dt><strong>lastCheck</strong>: <spanx style="verb">UTCDate</spanx></dt>
  <dd>
    <t>Timestamp of last health check.</t>
  </dd>
  <dt><strong>consecutiveFailures</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Count of consecutive failed health checks.</t>
  </dd>
</dl>

</section>
<section anchor="example-status-response"><name>Example Status Response</name>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "registrationId": "reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d",
  "status": "active",
  "createdAt": "2024-12-21T15:30:00Z",
  "expiresAt": "2025-12-21T15:30:00Z",
  "lastInvocation": "2024-12-21T16:42:18Z",

  "statistics": {
    "invocations": {
      "total": 15482,
      "last24h": 3241,
      "last7d": 10234,
      "last30d": 43210
    },
    "errors": {
      "total": 32,
      "last24h": 5,
      "last7d": 12,
      "last30d": 28
    },
    "averageResponseMs": 45
  },

  "health": {
    "status": "healthy",
    "lastCheck": "2024-12-21T16:44:00Z",
    "consecutiveFailures": 0
  }
}
]]></artwork></figure>

</section>
<section anchor="registration-expiration-and-renewal"><name>Registration Expiration and Renewal</name>

<t>Registrations <bcp14>MAY</bcp14> have an expiration time set by the scanner based on policy. The MTA <bcp14>MUST</bcp14> re-register before expiration to maintain continuous service. Re-registration follows the same process as initial registration and requires full capability renegotiation; the scanner <bcp14>SHOULD</bcp14> issue a fresh registration identifier on renewal and <bcp14>SHOULD</bcp14> continue to honor hook invocations carrying the prior identifier for a brief grace period to avoid races.</t>

<t>The MTA <bcp14>SHOULD</bcp14> monitor its registration status (either by tracking expiresAt locally or by polling the status endpoint) and initiate re-registration before expiration.</t>

</section>
</section>
<section anchor="deregistration"><name>Deregistration</name>

<t>The MTA deregisters by sending an HTTP DELETE request to the deregistration endpoint.</t>

<figure><artwork><![CDATA[
DELETE /v1/hooks/register/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d \
  HTTP/1.1
Host: scanner.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
]]></artwork></figure>

<t>Upon successful deregistration, the scanner returns HTTP status 200 with confirmation:</t>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "registrationId": "reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d",
  "status": "deregistered",
  "deregisteredAt": "2024-12-21T16:45:00Z"
}
]]></artwork></figure>

<t>After deregistration, the MTA <bcp14>MUST NOT</bcp14> send further hook invocations referencing the deregistered registration identifier.</t>

<section anchor="in-flight-requests"><name>In-Flight Requests</name>

<t>Hook invocations that are in-flight at the time of deregistration <bcp14>MAY</bcp14> complete normally. The scanner <bcp14>SHOULD</bcp14> accept and respond to hook requests that arrive during or shortly after deregistration processing, as network latency may cause requests dispatched before deregistration to arrive afterward.</t>

<t>Once deregistration completes, the MTA <bcp14>MUST NOT</bcp14> initiate new hook invocations to the deregistered scanner's hook endpoint. The scanner <bcp14>SHOULD</bcp14> allow a brief grace period (implementation-defined, but typically a few seconds) for in-flight requests before considering the deregistration fully complete.</t>

</section>
<section anchor="scanner-initiated-termination"><name>Scanner-Initiated Termination</name>

<t>The scanner <bcp14>MAY</bcp14> terminate a registration by setting its status to "deregistered" and returning an error to subsequent MTA requests against the registration. Implementation-specific policies govern when scanners do this, for example after detecting that the MTA has stopped sending hook requests for an extended period. The scanner <bcp14>SHOULD</bcp14> log such terminations and the MTA <bcp14>SHOULD</bcp14> treat any 404 REGISTRATION_NOT_FOUND response on a previously-active registration as a signal to re-register.</t>

</section>
</section>
</section>
<section anchor="hook-request"><name>Hook Request</name>

<t>When processing reaches a stage for which scanners are registered, the MTA constructs a hook request and transmits it to each registered scanner's hook endpoint.</t>

<section anchor="request-structure"><name>Request Structure</name>

<t>Hook requests are transmitted via HTTP POST to the hook endpoint URL returned in the registration response. The <spanx style="verb">Content-Type</spanx> header indicates the serialization format negotiated during registration.</t>

<t>The following request headers apply to hook invocations:</t>

<dl newline="true">
  <dt><strong>X-MTA-Hooks-Registration</strong></dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The registration identifier returned during registration. The scanner uses this to correlate the request with negotiated capabilities and to multiplex registrations sharing a hook endpoint host.</t>
  </dd>
  <dt><strong>X-MTA-Hooks-Request-Id</strong></dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. A unique identifier for this logical hook invocation. The MTA <bcp14>MUST</bcp14> keep this value stable across retries of the same invocation. Scanners <bcp14>SHOULD</bcp14> deduplicate on this identifier to remain idempotent under retry. The value <bcp14>MUST</bcp14> be a string of at most 128 ASCII characters drawn from the unreserved set defined in <xref target="RFC3986"/>.</t>
  </dd>
  <dt><strong>Authorization</strong> (or transport-layer credentials)</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. See <xref target="hook-authentication"/>.</t>
  </dd>
</dl>

<t>The request body contains a JSON or CBOR object with properties determined by the registration. The following sections describe available properties organized by category.</t>

</section>
<section anchor="hook-authentication"><name>Authentication</name>

<t>The MTA <bcp14>MUST</bcp14> authenticate every hook invocation using the credentials provisioned for the registration. Scanners <bcp14>MUST</bcp14> verify the credentials and reject any unauthenticated hook request with HTTP 401. Scanners <bcp14>SHOULD</bcp14> also verify that the credentials are bound to the registration identified by <spanx style="verb">X-MTA-Hooks-Registration</spanx>; a mismatch <bcp14>MUST</bcp14> be rejected with HTTP 403.</t>

<t>The same authentication mechanisms supported for registration (<xref target="registration-authentication"/>) apply to hook invocations.</t>

</section>
<section anchor="common-properties"><name>Common Properties</name>

<t>The following properties are available for both inbound and outbound processing:</t>

<dl newline="true">
  <dt><strong>stage</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The current processing stage.</t>
  </dd>
  <dt><strong>action</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The action the MTA will perform if no scanner modifications occur. For inbound processing, values are "accept", "reject", "discard", "quarantine", or "disconnect". For outbound processing, values are "continue" or "cancel".</t>
  </dd>
  <dt><strong>envelope</strong>: <spanx style="verb">Envelope</spanx></dt>
  <dd>
    <t>The message envelope containing sender and recipient information.</t>
  </dd>
  <dt><strong>message</strong>: <spanx style="verb">Object|null</spanx></dt>
  <dd>
    <t>A structured representation of the email message based on the Email object defined in <xref section="4" sectionFormat="of" target="RFC8621"/>.</t>
  </dd>
  <dt><strong>rawMessage</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>The complete message in Internet Message Format as defined in <xref target="RFC5322"/>. In JSON serialization, the value is Base64-encoded. In CBOR serialization, the value is a raw byte string.</t>
  </dd>
  <dt><strong>timestamp</strong>: <spanx style="verb">UTCDate</spanx></dt>
  <dd>
    <t>Timestamp when the current stage began.</t>
  </dd>
  <dt><strong>protocol</strong>: <spanx style="verb">ProtocolInfo|null</spanx></dt>
  <dd>
    <t>Protocol information.</t>
  </dd>
  <dt><strong>queue</strong>: <spanx style="verb">QueueInfo|null</spanx></dt>
  <dd>
    <t>Queue information.</t>
  </dd>
  <dt><strong>server</strong>: <spanx style="verb">ServerInfo|null</spanx></dt>
  <dd>
    <t>Information about the MTA.</t>
  </dd>
</dl>

</section>
<section anchor="envelope-properties"><name>Envelope Properties</name>

<t>An <strong>Envelope</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>from</strong>: <spanx style="verb">EnvelopeAddress</spanx></dt>
  <dd>
    <t>Sender information from MAIL FROM command.</t>
  </dd>
  <dt><strong>to</strong>: <spanx style="verb">EnvelopeAddress[]|DeliveryRecipient[]</spanx></dt>
  <dd>
    <t>Recipient information from RCPT TO commands. For inbound processing, this is an array of EnvelopeAddress objects. For outbound processing, this is an array of DeliveryRecipient objects.</t>
  </dd>
</dl>

<t>An <strong>EnvelopeAddress</strong> object represents an address in the message envelope and has the following properties:</t>

<dl>
  <dt><strong>address</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>The email address. For MAIL FROM, this <bcp14>MAY</bcp14> be null to represent the null reverse-path. For RCPT TO, this <bcp14>MUST NOT</bcp14> be null.</t>
  </dd>
  <dt><strong>parameters</strong>: <spanx style="verb">String[String]</spanx></dt>
  <dd>
    <t>SMTP parameters associated with the address as key-value pairs. Common parameters include ORCPT, ENVID, and other DSN-related parameters defined in <xref target="RFC3461"/>.</t>
  </dd>
</dl>

<t>For outbound processing, recipient objects include additional delivery status fields described in <xref target="outbound-properties"/>.</t>

</section>
<section anchor="queue-properties"><name>Queue Properties</name>

<t>A <strong>QueueInfo</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>id</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Unique queue identifier for this message within this MTA. The identifier <bcp14>MUST</bcp14> be unique for the lifetime of the message in the queue and <bcp14>SHOULD</bcp14> remain stable across hook invocations for the same queued message.</t>
  </dd>
</dl>

</section>
<section anchor="message-properties"><name>Message Properties</name>

<section anchor="structured-message"><name>Structured Message</name>

<t>The <spanx style="verb">message</spanx> property contains a structured representation of the email message based on the Email object defined in <xref section="4" sectionFormat="of" target="RFC8621"/>. The following differences from the JMAP Email object apply:</t>

<t><list style="symbols">
  <t>Metadata properties defined in <xref section="4.1.1" sectionFormat="of" target="RFC8621"/> are not included, with the exception of the "size" property which <bcp14>MAY</bcp14> be present.</t>
  <t>The <spanx style="verb">blobId</spanx> property is replaced by a <spanx style="verb">blob</spanx> property containing the actual content. In JSON serialization, blob values are Base64-encoded strings. In CBOR serialization, blob values are raw byte strings.</t>
</list></t>

<t>Property availability depends on the processing stage and MTA capabilities. At early stages such as "connect" or "ehlo", message properties are not available.</t>

</section>
<section anchor="raw-message"><name>Raw Message</name>

<t>The <spanx style="verb">rawMessage</spanx> property contains the complete message in Internet Message Format as defined in <xref target="RFC5322"/>, including all MIME parts
and attachments. In JSON serialization, the value is Base64-encoded. In CBOR serialization, the value is a raw byte string.</t>

<t>The <spanx style="verb">rawMessage</spanx> property represents the entire message as stored or received by the MTA. When present, it provides byte-exact access to the message content, which is necessary for operations such as cryptographic signature verification.</t>

<t>Scanners <bcp14>MAY</bcp14> request both <spanx style="verb">message</spanx> and <spanx style="verb">rawMessage</spanx> properties. If a scanner's response modifies both properties, only <spanx style="verb">rawMessage</spanx> modifications are applied; <spanx style="verb">message</spanx> modifications are ignored.</t>

<t>The raw message content <bcp14>MUST NOT</bcp14> appear within the <spanx style="verb">message</spanx> property as a blob value. The <spanx style="verb">message</spanx> property contains only the structured parsed representation with individual body part contents available via <spanx style="verb">bodyValues</spanx>, while <spanx style="verb">rawMessage</spanx> contains the complete unparsed message.</t>

</section>
<section anchor="choosing-between-structured-and-raw"><name>Choosing Between Structured and Raw</name>

<t>The <spanx style="verb">message</spanx> property provides a structured, parsed representation suitable for:</t>

<t><list style="symbols">
  <t>Header inspection and modification</t>
  <t>Recipient analysis</t>
  <t>Content-type aware body part processing</t>
  <t>Efficient access to specific message components</t>
</list></t>

<t>The <spanx style="verb">rawMessage</spanx> property provides the complete RFC 5322 message suitable for:</t>

<t><list style="symbols">
  <t>Cryptographic verification (DKIM signature validation)</t>
  <t>Archival or compliance logging</t>
  <t>Processing that requires byte-exact message content</t>
  <t>Forwarding or re-injection without modification</t>
</list></t>

<t>Scanners that need both structured access and raw content <bcp14>SHOULD</bcp14> request both properties. When modifying messages, scanners <bcp14>SHOULD</bcp14> prefer structured modifications via the <spanx style="verb">message</spanx> property unless byte-exact control is required. Modifications to <spanx style="verb">rawMessage</spanx> require the scanner to produce a complete, valid RFC 5322 message.</t>

</section>
</section>
<section anchor="server-properties"><name>Server Properties</name>

<t>A <strong>ServerInfo</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>name</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Server hostname.</t>
  </dd>
  <dt><strong>ip</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Server IP address.</t>
  </dd>
  <dt><strong>port</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Server port number.</t>
  </dd>
</dl>

</section>
<section anchor="protocol-properties"><name>Protocol Properties</name>

<t>A <strong>ProtocolInfo</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>version</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>MTA Hooks protocol version.</t>
  </dd>
</dl>

</section>
<section anchor="inbound-properties"><name>Inbound Properties</name>

<t>The following properties are available only during inbound processing:</t>

<dl>
  <dt><strong>response</strong>: <spanx style="verb">SmtpResponse|null</spanx></dt>
  <dd>
    <t>The SMTP response the MTA would send if no scanner modifications occur.</t>
  </dd>
  <dt><strong>client</strong>: <spanx style="verb">ClientInfo|null</spanx></dt>
  <dd>
    <t>Information about the connecting SMTP client.</t>
  </dd>
  <dt><strong>senderAuth</strong>: <spanx style="verb">SenderAuthentication|null</spanx></dt>
  <dd>
    <t>Results of sender authentication checks.</t>
  </dd>
  <dt><strong>auth</strong>: <spanx style="verb">SmtpAuthentication|null</spanx></dt>
  <dd>
    <t>SMTP authentication information, if the client authenticated.</t>
  </dd>
  <dt><strong>tls</strong>: <spanx style="verb">TlsInfo|null</spanx></dt>
  <dd>
    <t>TLS connection information.</t>
  </dd>
</dl>

<section anchor="smtp-response-properties"><name>SMTP Response Properties</name>

<t>An <strong>SmtpResponse</strong> object represents an SMTP response and has the following properties:</t>

<dl newline="true">
  <dt><strong>code</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>The three-digit SMTP status code.</t>
  </dd>
  <dt><strong>enhancedCode</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>The enhanced mail system status code as defined in <xref target="RFC3463"/>, if available.</t>
  </dd>
  <dt><strong>message</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The human-readable response text.</t>
  </dd>
</dl>

</section>
<section anchor="client-properties"><name>Client Properties</name>

<t>A <strong>ClientInfo</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>ip</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Client IP address.</t>
  </dd>
  <dt><strong>port</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Client port number.</t>
  </dd>
  <dt><strong>ptr</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>PTR record for client IP, if available.</t>
  </dd>
  <dt><strong>ehlo</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>EHLO or HELO string sent by client.</t>
  </dd>
  <dt><strong>asn</strong>: <spanx style="verb">UnsignedInt|null</spanx></dt>
  <dd>
    <t>Autonomous System Number for client IP, if available.</t>
  </dd>
  <dt><strong>country</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>ISO 3166-1 alpha-2 country code for client IP, if available.</t>
  </dd>
  <dt><strong>activeConnections</strong>: <spanx style="verb">UnsignedInt|null</spanx></dt>
  <dd>
    <t>Number of concurrent connections from this client.</t>
  </dd>
</dl>

</section>
<section anchor="tls-properties"><name>TLS Properties</name>

<t>A <strong>TlsInfo</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>version</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>TLS protocol version (e.g., "TLSv1.3").</t>
  </dd>
  <dt><strong>cipher</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Cipher suite name.</t>
  </dd>
  <dt><strong>cipherBits</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Cipher key length in bits.</t>
  </dd>
  <dt><strong>certIssuer</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>Client certificate issuer, if a client certificate was presented.</t>
  </dd>
  <dt><strong>certSubject</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>Client certificate subject, if a client certificate was presented.</t>
  </dd>
</dl>

</section>
<section anchor="sender-authentication-properties"><name>Sender Authentication Properties</name>

<t>A <strong>SenderAuthentication</strong> object has the following properties:</t>

<dl>
  <dt><strong>spf-ehlo</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>SPF result for EHLO identity as defined in <xref target="RFC7208"/>.</t>
  </dd>
  <dt><strong>spf-mail</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>SPF result for MAIL FROM identity as defined in <xref target="RFC7208"/>.</t>
  </dd>
  <dt><strong>dkim</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>DKIM verification result as defined in <xref target="RFC6376"/>.</t>
  </dd>
  <dt><strong>arc</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>ARC verification result.</t>
  </dd>
  <dt><strong>dmarc</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>DMARC evaluation result as defined in <xref target="RFC7489"/>.</t>
  </dd>
</dl>

<t>Authentication result values follow the conventions established in the respective specifications.</t>

</section>
<section anchor="smtp-authentication-properties"><name>SMTP Authentication Properties</name>

<t>An <strong>SmtpAuthentication</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>login</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Authenticated username.</t>
  </dd>
  <dt><strong>method</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>SASL mechanism used for authentication.</t>
  </dd>
</dl>

</section>
</section>
<section anchor="outbound-properties"><name>Outbound Properties</name>

<t>The following properties are available only during outbound processing.</t>

<section anchor="extended-queue-properties"><name>Extended Queue Properties</name>

<t>For outbound processing, the queue property uses an <strong>OutboundQueueInfo</strong> object, which extends QueueInfo with additional fields:</t>

<dl newline="true">
  <dt><strong>id</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>Unique queue identifier for this message.</t>
  </dd>
  <dt><strong>expiresAt</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>Timestamp when the queue entry expires.</t>
  </dd>
  <dt><strong>attempts</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>Total delivery attempts made so far.</t>
  </dd>
</dl>

</section>
<section anchor="recipient-delivery-status"><name>Recipient Delivery Status</name>

<t>For outbound processing, each recipient in envelope.to is represented as a DeliveryRecipient object.</t>

<t>A <strong>DeliveryRecipient</strong> object extends EnvelopeAddress with delivery status information and has the following properties:</t>

<dl newline="true">
  <dt><strong>address</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The recipient email address.</t>
  </dd>
  <dt><strong>parameters</strong>: <spanx style="verb">String[String]</spanx></dt>
  <dd>
    <t>SMTP parameters associated with the address as key-value pairs.</t>
  </dd>
  <dt><strong>status</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>The delivery status for this recipient. Values are:
</t>

    <t><list style="symbols">
      <t>"pending": The MTA has not yet attempted delivery for this recipient.</t>
      <t>"delivered": Delivery succeeded.</t>
      <t>"deferred": Delivery failed transiently and will be retried per the schedule in <spanx style="verb">nextAttemptAt</spanx>.</t>
      <t>"failed": Delivery failed permanently and the MTA will generate a failure DSN.</t>
      <t>"failed-silent": Delivery is suppressed and the MTA <bcp14>MUST NOT</bcp14> generate any DSN for this recipient. Typically set by a scanner via modification to drop a recipient without notifying the sender.</t>
    </list></t>
  </dd>
  <dt><strong>attempt</strong>: <spanx style="verb">UnsignedInt</spanx></dt>
  <dd>
    <t>The current delivery attempt number for this recipient.</t>
  </dd>
  <dt><strong>lastResponse</strong>: <spanx style="verb">SmtpResponse|null</spanx></dt>
  <dd>
    <t>The last SMTP response received for this recipient, or null if no attempt has been made.</t>
  </dd>
  <dt><strong>nextAttemptAt</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>The scheduled time for the next delivery attempt, or null if no retry is scheduled.</t>
  </dd>
  <dt><strong>nextDsnAt</strong>: <spanx style="verb">UTCDate|null</spanx></dt>
  <dd>
    <t>The scheduled time for the next DSN generation, or null if no DSN is scheduled.</t>
  </dd>
  <dt><strong>queueName</strong>: <spanx style="verb">String|null</spanx></dt>
  <dd>
    <t>The name of the outbound queue handling this recipient, if applicable.</t>
  </dd>
</dl>

<t>For the "dsn" stage, the <spanx style="verb">message</spanx> and <spanx style="verb">rawMessage</spanx> properties contain the DSN message that the MTA is about to send. Scanners <bcp14>MAY</bcp14> modify or delete these properties to alter or suppress DSN generation.</t>

</section>
</section>
<section anchor="example-inbound-hook-request"><name>Example Inbound Hook Request</name>

<figure><artwork><![CDATA[
POST /v1/hooks/invoke/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d \
  HTTP/1.1
Host: scanner.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-MTA-Hooks-Registration: reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d
X-MTA-Hooks-Request-Id: 01HZ8K3X7F4Y5N6Q9R2S3T4U5V

{
  "stage": "data",
  "action": "accept",
  "timestamp": "2024-12-21T16:30:00Z",

  "response": {
    "code": 250,
    "enhancedCode": "2.0.0",
    "message": "OK"
  },

  "protocol": {
    "version": "1.0"
  },

  "queue": {
    "id": "queue_abc123"
  },

  "envelope": {
    "from": {
      "address": "sender@example.org",
      "parameters": {}
    },
    "to": [
      {
        "address": "recipient@example.com",
        "parameters": {}
      }
    ]
  },

  "message": {
    "size": 2048,
    "subject": "Meeting Tomorrow",
    "from": [
      {
        "name": "Sender Name",
        "email": "sender@example.org"
      }
    ],
    "to": [
      {
        "email": "recipient@example.com"
      }
    ],
    "sentAt": "2024-12-21T16:29:00Z",
    "messageId": ["<msg123@example.org>"],
    "headers": [
      {"name": "From", "value": "Sender Name <sender@example.org>"},
      {"name": "To", "value": "recipient@example.com"},
      {"name": "Subject", "value": "Meeting Tomorrow"},
      {"name": "Date", "value": "Sat, 21 Dec 2024 16:29:00 +0000"},
      {"name": "Message-ID", "value": "<msg123@example.org>"}
    ],
    "bodyStructure": {
      "type": "text/plain",
      "charset": "utf-8",
      "size": 28
    },
    "bodyValues": {
      "1": {
        "value": "Let's meet tomorrow at 10am.",
        "isEncodingProblem": false,
        "isTruncated": false
      }
    }
  },

  "client": {
    "ip": "192.0.2.100",
    "port": 54321,
    "ptr": "mail.example.org",
    "ehlo": "mail.example.org",
    "activeConnections": 3
  },

  "server": {
    "name": "mx1.example.com",
    "ip": "198.51.100.25",
    "port": 25
  },

  "tls": {
    "version": "TLSv1.3",
    "cipher": "TLS_AES_256_GCM_SHA384",
    "cipherBits": 256
  },

  "senderAuth": {
    "spf-mail": "pass",
    "dkim": "pass",
    "dmarc": "pass"
  }
}
]]></artwork></figure>

</section>
<section anchor="example-outbound-hook-request"><name>Example Outbound Hook Request</name>

<figure><artwork><![CDATA[
POST /v1/hooks/invoke/reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d \
  HTTP/1.1
Host: scanner.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-MTA-Hooks-Registration: reg_7a3b9c2e-4d5f-6a7b-8c9d-0e1f2a3b4c5d
X-MTA-Hooks-Request-Id: 01HZ8K9P2QABCDEFGH7J8K9L0M

{
  "stage": "delivery",
  "action": "continue",
  "timestamp": "2024-12-21T17:00:00Z",

  "protocol": {
    "version": "1.0"
  },

  "queue": {
    "id": "queue_def456",
    "expiresAt": "2024-12-24T17:00:00Z",
    "attempts": 3
  },

  "envelope": {
    "from": {
      "address": "notifications@example.com",
      "parameters": {}
    },
    "to": [
      {
        "address": "user1@recipient.example",
        "parameters": {},
        "status": "delivered",
        "attempt": 1,
        "lastResponse": {
          "code": 250,
          "enhancedCode": "2.0.0",
          "message": "Message accepted"
        }
      },
      {
        "address": "user2@recipient.example",
        "parameters": {},
        "status": "deferred",
        "attempt": 3,
        "lastResponse": {
          "code": 451,
          "enhancedCode": "4.7.1",
          "message": "Try again later"
        },
        "nextAttemptAt": "2024-12-21T18:00:00Z",
        "nextDsnAt": "2024-12-22T17:00:00Z"
      }
    ]
  },

  "message": {
    "subject": "Your order has shipped",
    "from": [{"email": "notifications@example.com"}],
    "to": [
      {"email": "user1@recipient.example"},
      {"email": "user2@recipient.example"}
    ],
    "size": 4096
  },

  "server": {
    "name": "smtp-out.example.com",
    "ip": "198.51.100.50",
    "port": 25
  }
}
]]></artwork></figure>

</section>
</section>
<section anchor="hook-response"><name>Hook Response</name>

<t>Scanners respond to hook requests with modifications to the request object. These modifications instruct the MTA how to proceed with message processing.</t>

<section anchor="response-structure"><name>Response Structure</name>

<t>On success, scanners respond with HTTP 200 OK and a body conforming to this section, or with HTTP 204 No Content and an empty body to indicate "no modifications". The response body contains a JSON or CBOR object specifying modifications to apply to the hook request. The object has the following fields:</t>

<dl>
  <dt><strong>set</strong>: <spanx style="verb">SetOperation[]|null</spanx></dt>
  <dd>
    <t>An array of set operations to apply, or null if no set operations.</t>
  </dd>
  <dt><strong>add</strong>: <spanx style="verb">AddOperation[]|null</spanx></dt>
  <dd>
    <t>An array of add operations to apply, or null if no add operations.</t>
  </dd>
  <dt><strong>delete</strong>: <spanx style="verb">DeleteOperation[]|null</spanx></dt>
  <dd>
    <t>An array of delete operations to apply, or null if no delete
operations.</t>
  </dd>
</dl>

<t>A <strong>SetOperation</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>path</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>JSON Pointer (per <xref target="RFC6901"/>) to the property to replace.</t>
  </dd>
  <dt><strong>value</strong>: <spanx style="verb">any</spanx></dt>
  <dd>
    <t>The new value for the property.</t>
  </dd>
</dl>

<t>An <strong>AddOperation</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>path</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>JSON Pointer to the location where the value should be added.</t>
  </dd>
  <dt><strong>value</strong>: <spanx style="verb">any</spanx></dt>
  <dd>
    <t>The value to add.</t>
  </dd>
  <dt><strong>index</strong>: <spanx style="verb">UnsignedInt|null</spanx></dt>
  <dd>
    <t>For array additions, the zero-based index at which to insert the
value. If null or omitted, the value is appended to the array.</t>
  </dd>
</dl>

<t>A <strong>DeleteOperation</strong> object has the following properties:</t>

<dl newline="true">
  <dt><strong>path</strong>: <spanx style="verb">String</spanx></dt>
  <dd>
    <t>JSON Pointer to the property to remove.</t>
  </dd>
</dl>

</section>
<section anchor="actions"><name>Actions</name>

<t>Scanners change the MTA's action by including a set operation targeting the "/action" path. The following values are valid for inbound and outbound processing respectively.</t>

<t>The following action values are valid:</t>

<section anchor="inbound-actions"><name>Inbound Actions</name>

<dl newline="true">
  <dt><strong>accept</strong></dt>
  <dd>
    <t>Accept the message for delivery to recipients. Non-terminal; chain
continues.</t>
  </dd>
  <dt><strong>reject</strong></dt>
  <dd>
    <t>Reject the message and return an error response to the sending
client. Terminal; chain stops.</t>
  </dd>
  <dt><strong>discard</strong></dt>
  <dd>
    <t>Accept the message from the client but do not deliver it. The
client receives a success response. Terminal; chain stops.</t>
  </dd>
  <dt><strong>quarantine</strong></dt>
  <dd>
    <t>Accept the message and place it in quarantine for administrative
review. Quarantine location and handling are implementation-defined.
Non-terminal; chain continues.</t>
  </dd>
  <dt><strong>disconnect</strong></dt>
  <dd>
    <t>Terminate the SMTP connection immediately. Terminal; chain stops.</t>
  </dd>
</dl>

</section>
<section anchor="outbound-actions"><name>Outbound Actions</name>

<dl>
  <dt><strong>continue</strong></dt>
  <dd>
    <t>Proceed with normal processing. Non-terminal; chain continues.</t>
  </dd>
  <dt><strong>cancel</strong></dt>
  <dd>
    <t>Cancel all pending deliveries for this message. Terminal; chain stops.</t>
  </dd>
</dl>

</section>
</section>
<section anchor="modifications-1"><name>Modifications</name>

<t>Scanners communicate changes by specifying operations on the hook request object. The response contains JSON Pointer paths identifying properties to modify and the operations to perform. These modifications can alter any aspect of the transaction that the MTA permits, including:</t>

<t><list style="symbols">
  <t>The action the MTA should take (accept, reject, quarantine, etc.)</t>
  <t>The SMTP response to send to the client or expect from the server</t>
  <t>Message headers and body content</t>
  <t>Envelope addresses (sender and recipients)</t>
  <t>Per-recipient delivery status for outbound processing</t>
</list></t>

<t>Three modification operations are supported:</t>

<dl newline="true">
  <dt><strong>set</strong></dt>
  <dd>
    <t>Replace the value at a specified path with a new value.</t>
  </dd>
  <dt><strong>add</strong></dt>
  <dd>
    <t>Insert a value at a specified path. For objects, this adds a new
property. For arrays, this inserts an element at the specified
index or appends if no index is given.</t>
  </dd>
  <dt><strong>delete</strong></dt>
  <dd>
    <t>Remove the value at a specified path.</t>
  </dd>
</dl>

<section anchor="set-operations"><name>Set Operations</name>

<t>Set operations replace values at specified paths.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "set": [
    {
      "path": "/action",
      "value": "reject"
    },
    {
      "path": "/response",
      "value": {
        "code": 550,
        "enhancedCode": "5.7.1",
        "message": "Message rejected due to policy"
      }
    }
  ]
}
]]></sourcecode></figure>

</section>
<section anchor="add-operations"><name>Add Operations</name>

<t>Add operations insert new values. For arrays, an optional index specifies insertion position.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "add": [
    {
      "path": "/message/headers",
      "value": {"name": "X-Spam-Score", "value": "5.2"},
      "index": 0
    },
    {
      "path": "/envelope/to",
      "value": {
        "address": "archive@example.com",
        "parameters": {}
      }
    }
  ]
}
]]></sourcecode></figure>

</section>
<section anchor="delete-operations"><name>Delete Operations</name>

<t>Delete operations remove values at specified paths. When deleting array elements, indices refer to positions in the array at the time each delete operation executes. Because delete operations execute sequentially and earlier deletions cause subsequent elements to shift to lower indices, scanners <bcp14>SHOULD</bcp14> order array deletions from highest to lowest index to avoid unexpected results.</t>

<t>For example, to delete elements originally at indices 1 and 3 from an array:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "delete": [
    {"path": "/message/headers/3"},
    {"path": "/message/headers/1"}
  ]
}
]]></sourcecode></figure>

<t>Deleting index 3 first leaves the element originally at index 1 still at index 1. If the order were reversed, deleting index 1 first would shift the element originally at index 3 to index 2.</t>

</section>
<section anchor="modification-order"><name>Modification Order</name>

<t>The MTA applies modifications in the following order:</t>

<t><list style="numbers" type="1">
  <t>Set operations</t>
  <t>Add operations</t>
  <t>Delete operations</t>
</list></t>

<t>This ordering allows predictable results when multiple operations affect related paths.</t>

<t>To change the action the MTA takes, the scanner sets the "/action" path to the desired value. To modify the SMTP response, the scanner can either set individual response fields (e.g., "/response/code", "/response/message") or replace the entire response object by setting "/response".</t>

<t>If a scanner modifies both the "message" and "rawMessage" properties, the "rawMessage" modification takes precedence and "message" modifications are ignored.</t>

</section>
<section anchor="conflicting-operations"><name>Conflicting Operations</name>

<t>If a response contains multiple operations targeting the same path or overlapping paths, the MTA applies them in the defined order (set, then add, then delete). The final state reflects all operations applied sequentially. For example, if a response sets "/message/subject" and also deletes "/message/subject", the subject will be deleted (delete operations execute last).</t>

<t>Implementations <bcp14>SHOULD NOT</bcp14> submit responses with conflicting operations targeting the same path, as the resulting behavior, while deterministic, may be confusing.</t>

</section>
<section anchor="no-modification-response"><name>No Modification Response</name>

<t>If a scanner has no modifications to request, it <bcp14>MUST</bcp14> return either:</t>

<t><list style="symbols">
  <t>An empty JSON/CBOR object: <spanx style="verb">{}</spanx></t>
  <t>A response with empty or null modification arrays: <spanx style="verb">{"set": null, "add": null, "delete": null}</spanx></t>
  <t>An HTTP 204 No Content response with no body</t>
</list></t>

<t>In all cases, the MTA proceeds with the action specified in the original request. The scanner chain continues to the next registered scanner unless the current action is terminal.</t>

</section>
<section anchor="size-limits"><name>Size Limits</name>

<t>MTAs <bcp14>MAY</bcp14> impose limits on the size of modification values. If a modification would cause a header or message to exceed configured size limits, the MTA <bcp14>SHOULD</bcp14> reject that specific modification and log the failure.</t>

</section>
<section anchor="modification-errors"><name>Modification Errors</name>

<t>If a modification cannot be applied (for example, the path references a non-existent property for deletion, or the path is not in the permitted updateProperties list), the MTA <bcp14>SHOULD</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Log the error with sufficient detail for debugging</t>
  <t>Increment modification failure statistics</t>
  <t>Continue processing remaining modifications in the response</t>
</list></t>

<t>The MTA <bcp14>MUST NOT</bcp14> reject the entire response due to a single failed modification unless the failed modification is critical to interpreting the response (such as an invalid action value).</t>

</section>
</section>
<section anchor="hook-error-responses"><name>Error Responses</name>

<t>A scanner that cannot process a hook request returns an HTTP 4xx or 5xx status with a body that follows the error structure defined in <xref target="error-codes"/>. Status code semantics:</t>

<t><list style="symbols">
  <t>401 Unauthorized: The MTA's credentials are missing or invalid. The MTA <bcp14>MUST NOT</bcp14> retry without acquiring fresh credentials.</t>
  <t>403 Forbidden: The credentials are valid but not authorized for this registration or operation. The MTA <bcp14>MUST NOT</bcp14> retry without operator intervention.</t>
  <t>404 Not Found: The registration referenced by <spanx style="verb">X-MTA-Hooks-Registration</spanx> is unknown to the scanner. The MTA <bcp14>SHOULD</bcp14> treat the registration as terminated and re-register before sending further hooks.</t>
  <t>410 Gone: The registration has been deregistered. The MTA <bcp14>MUST</bcp14> stop sending hooks under this registration; the MTA <bcp14>MAY</bcp14> re-register.</t>
  <t>413 Content Too Large: The request body exceeds the scanner's <spanx style="verb">maxMessageSize</spanx>. The MTA <bcp14>MUST NOT</bcp14> retry the same payload.</t>
  <t>422 Unprocessable Content: The request was syntactically valid but referenced unsupported properties or values. Treated as a 4xx; do not retry.</t>
  <t>429 Too Many Requests: The scanner is rate-limiting. The MTA <bcp14>SHOULD</bcp14> honor the <spanx style="verb">Retry-After</spanx> header if present.</t>
  <t>5xx: A transient scanner error. The MTA <bcp14>MAY</bcp14> retry per its retry policy (<xref target="retry-policy"/>).</t>
</list></t>

<t>If the response body is not parseable as the negotiated serialization, or if it conforms to the response schema but contains modifications targeting paths outside the registration's negotiated <spanx style="verb">updateProperties</spanx>, the MTA <bcp14>MUST</bcp14> treat the response as malformed: it <bcp14>MUST NOT</bcp14> apply any modifications from the response, <bcp14>MUST</bcp14> proceed with the default action carried in the request, <bcp14>MUST</bcp14> log the failure with the request identifier, and <bcp14>MAY</bcp14> count the response toward the scanner's failure statistics for circuit-breaking purposes.</t>

</section>
<section anchor="example-hook-responses"><name>Example Hook Responses</name>

<section anchor="accept-with-header-addition"><name>Accept with Header Addition</name>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "add": [
    {
      "path": "/message/headers",
      "value": {"name": "X-Spam-Status", "value": "No"},
      "index": 0
    },
    {
      "path": "/message/headers",
      "value": {"name": "X-Spam-Score", "value": "1.2"},
      "index": 1
    }
  ]
}
]]></artwork></figure>

</section>
<section anchor="reject-with-custom-response"><name>Reject with Custom Response</name>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "set": [
    {
      "path": "/action",
      "value": "reject"
    },
    {
      "path": "/response",
      "value": {
        "code": 550,
        "enhancedCode": "5.7.1",
        "message": "Message rejected: virus detected"
      }
    }
  ]
}
]]></artwork></figure>

</section>
<section anchor="modify-subject-and-add-recipient"><name>Modify Subject and Add Recipient</name>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "set": [
    {
      "path": "/message/subject",
      "value": "[EXTERNAL] Original Subject"
    }
  ],
  "add": [
    {
      "path": "/envelope/to",
      "value": {
        "address": "compliance@example.com",
        "parameters": {}
      }
    }
  ]
}
]]></artwork></figure>

</section>
<section anchor="cancel-specific-recipient-delivery"><name>Cancel Specific Recipient Delivery</name>

<t>For outbound processing, to cancel delivery for a specific recipient:</t>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "set": [
    {
      "path": "/envelope/to/1/status",
      "value": "failed-silent"
    }
  ]
}
]]></artwork></figure>

</section>
<section anchor="no-action-response"><name>No Action Response</name>

<t>If a scanner has no changes to request, it returns an empty response body or a response with no action or modifications:</t>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{}
]]></artwork></figure>

<t>The MTA proceeds with the default action specified in the request.</t>

</section>
</section>
</section>
<section anchor="transport"><name>Transport</name>

<t>This section specifies HTTP transport requirements for MTA Hooks communications.</t>

<section anchor="http-version"><name>HTTP Version</name>

<t>Implementations <bcp14>MUST</bcp14> support HTTP/1.1 <xref target="RFC9112"/>. Implementations <bcp14>SHOULD</bcp14> support HTTP/2 <xref target="RFC9113"/> for improved performance through multiplexing. Implementations <bcp14>MAY</bcp14> support HTTP/3 <xref target="RFC9114"/>.</t>

<t>When multiple HTTP versions are available, implementations <bcp14>SHOULD</bcp14> prefer newer versions for their performance benefits while maintaining fallback to HTTP/1.1.</t>

</section>
<section anchor="tls-requirements"><name>TLS Requirements</name>

<t>All MTA Hooks communications <bcp14>MUST</bcp14> use TLS. Implementations <bcp14>MUST</bcp14> support TLS 1.2 <xref target="RFC5246"/> and <bcp14>SHOULD</bcp14> support TLS 1.3 <xref target="RFC8446"/>.</t>

<t>Implementations <bcp14>MUST</bcp14> validate server certificates against trusted certificate authorities. Self-signed certificates <bcp14>SHOULD NOT</bcp14> be accepted in production deployments unless explicitly configured by administrators.</t>

<t>Cipher suite selection <bcp14>SHOULD</bcp14> follow current best practices. Implementations <bcp14>SHOULD</bcp14> disable cipher suites known to be weak or compromised.</t>

</section>
<section anchor="request-methods"><name>Request Methods</name>

<t>The following HTTP methods are used:</t>

<t><list style="symbols">
  <t>GET: Discovery document retrieval and status queries</t>
  <t>POST: Registration requests and hook invocations</t>
  <t>DELETE: Deregistration requests</t>
</list></t>

</section>
<section anchor="content-negotiation"><name>Content Negotiation</name>

<t>For hook requests and responses, the <spanx style="verb">Content-Type</spanx> header <bcp14>MUST</bcp14> be set to "application/json" for JSON serialization or "application/cbor" for CBOR serialization.</t>

<t>The <spanx style="verb">Accept</spanx> header <bcp14>MAY</bcp14> be used during discovery to indicate preferred serialization format. If the scanner cannot provide the requested format, it <bcp14>SHOULD</bcp14> return the discovery document in JSON format.</t>

</section>
<section anchor="error-handling"><name>Error Handling</name>

<section anchor="http-status-codes"><name>HTTP Status Codes</name>

<t>MTAs <bcp14>SHOULD</bcp14> interpret HTTP status codes as follows:</t>

<t><list style="symbols">
  <t>2xx: Request successful. Process response body.</t>
  <t>4xx: Client error. Do not retry; log error and proceed with default action.</t>
  <t>5xx: Server error. May retry according to policy.</t>
</list></t>

</section>
<section anchor="timeout-handling"><name>Timeout Handling</name>

<t>If a scanner does not respond within the configured timeout, the MTA <bcp14>SHOULD</bcp14> proceed with the default action. Timeout handling policy (fail-open vs. fail-closed) is implementation-defined and <bcp14>SHOULD</bcp14> be configurable.</t>

</section>
<section anchor="retry-policy"><name>Retry Policy</name>

<t>For transient errors (5xx status codes, network failures, timeouts), implementations <bcp14>SHOULD</bcp14> implement retry with exponential backoff. A recommended policy is:</t>

<t><list style="symbols">
  <t>Maximum 3 retry attempts</t>
  <t>Initial delay: 100 milliseconds</t>
  <t>Backoff multiplier: 2</t>
  <t>Maximum delay: 5 seconds</t>
  <t>Add random jitter of 0-100 milliseconds</t>
</list></t>

<t>The MTA <bcp14>MUST</bcp14> keep the <spanx style="verb">X-MTA-Hooks-Request-Id</spanx> header value stable across retries of the same logical invocation, so scanners can deduplicate. Implementations <bcp14>MAY</bcp14> provide configuration options to adjust retry parameters.</t>

</section>
</section>
<section anchor="connection-management"><name>Connection Management</name>

<t>Implementations <bcp14>SHOULD</bcp14> use connection pooling to reduce latency for repeated requests to the same scanner endpoint. HTTP/2 multiplexing, where available, reduces the need for multiple connections.</t>

<t>Implementations <bcp14>SHOULD</bcp14> respect HTTP keep-alive semantics and connection limits advertised by scanners.</t>

</section>
</section>
<section anchor="implementation-considerations"><name>Implementation Considerations</name>

<section anchor="mta-considerations"><name>MTA Considerations</name>

<section anchor="unavailable-scanners"><name>Unavailable Scanners</name>

<t>When a scanner becomes unavailable (timeouts, errors, deregistration), the MTA must determine how to proceed. Common policies include:</t>

<t><list style="symbols">
  <t>Fail-open: Proceed with default action as if scanner approved</t>
  <t>Fail-closed: Reject or defer message processing</t>
</list></t>

<t>The appropriate policy depends on deployment requirements. Security-focused deployments may prefer fail-closed, while availability-focused deployments may prefer fail-open. Implementations <bcp14>SHOULD</bcp14> make this policy configurable.</t>

</section>
<section anchor="performance-considerations"><name>Performance Considerations</name>

<t>Synchronous hook invocation adds latency to mail processing. Implementations <bcp14>SHOULD</bcp14> consider:</t>

<t><list style="symbols">
  <t>Connection pooling and keep-alive for scanner connections</t>
  <t>Parallel invocation of independent scanners where ordering is not required</t>
  <t>Timeout tuning based on scanner response time characteristics</t>
</list></t>

</section>
</section>
<section anchor="scanner-considerations"><name>Scanner Considerations</name>

<section anchor="idempotency"><name>Idempotency</name>

<t>Scanners <bcp14>SHOULD</bcp14> design their processing to be idempotent. Network issues or MTA retries may result in duplicate invocations for the same message. Scanners <bcp14>SHOULD</bcp14> handle duplicate requests gracefully.</t>

</section>
<section anchor="response-time"><name>Response Time</name>

<t>Scanners operate in the critical path of mail delivery. Long response times delay message processing and may cause timeouts. Scanners <bcp14>SHOULD</bcp14>:</t>

<t><list style="symbols">
  <t>Process requests promptly</t>
  <t>Implement internal timeouts shorter than MTA timeouts</t>
  <t>Consider asynchronous processing for expensive operations</t>
  <t>Return default responses when processing cannot complete in time</t>
</list></t>

</section>
<section anchor="stateless-design"><name>Stateless Design</name>

<t>Scanners <bcp14>SHOULD</bcp14> avoid relying on state from previous invocations. Each hook request contains complete context for processing decisions. Stateless design improves reliability and simplifies horizontal scaling.</t>

</section>
</section>
<section anchor="large-message-handling"><name>Large Message Handling</name>

<t>Large messages present challenges for both MTAs and scanners. Implementations <bcp14>SHOULD</bcp14> consider:</t>

<t><list style="symbols">
  <t>Message size limits advertised in discovery documents</t>
  <t>Truncation policies for oversized messages</t>
  <t>Memory management for large message bodies</t>
</list></t>

<t>Streaming or chunked delivery is not currently specified. For very large messages, implementations <bcp14>MAY</bcp14> arrange out-of-band content retrieval, though this is outside the scope of this specification.</t>

</section>
<section anchor="high-availability"><name>High Availability</name>

<section anchor="scanner-high-availability"><name>Scanner High Availability</name>

<t>For production deployments, scanners <bcp14>SHOULD</bcp14> be deployed with redundancy. Approaches include:</t>

<t><list style="symbols">
  <t>Multiple scanner instances behind a load balancer</t>
  <t>Health checking with automatic failover</t>
  <t>Geographic distribution for disaster recovery</t>
</list></t>

<t>Hook endpoints typically resolve to a load-balanced address; the MTA holds a single endpoint URL per registration.</t>

</section>
<section anchor="registration-state"><name>Registration State</name>

<t>Registration state resides at the scanner. Scanner instances behind a load balancer <bcp14>MUST</bcp14> share registration state (or partition deterministically by registration identifier) so that hook requests can be served regardless of which instance receives them. The MTA <bcp14>SHOULD</bcp14> treat 404 REGISTRATION_NOT_FOUND on a previously-active registration as a signal to re-register rather than as a permanent failure.</t>

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

<section anchor="trust-model"><name>Trust Model</name>

<t>MTA Hooks places the MTA exclusively in the role of HTTP client. The MTA does not expose any HTTP server to scanners and does not accept inbound registration requests. This containment is deliberate: it eliminates a category of attacks (registration flood, server-side request forgery via callback verification, exposure of MTA management endpoints) that would otherwise threaten the most security-critical component on the mail path.</t>

<t>The trust boundary runs in one direction. The scanner operator decides which MTAs may register and provisions credentials accordingly. The MTA admin decides which scanners to call out to and configures them out of band. Mutual trust is established before any protocol traffic flows.</t>

</section>
<section anchor="authentication-and-authorization"><name>Authentication and Authorization</name>

<t>Authentication of every MTA-to-scanner request (registration, status, deregistration, hook invocation) is <bcp14>REQUIRED</bcp14>. Scanners <bcp14>MUST</bcp14> reject unauthenticated requests with HTTP 401. The specific authentication mechanism is out of scope; recommended approaches:</t>

<t><list style="symbols">
  <t>Bearer tokens: Simple to implement; tokens <bcp14>MUST</bcp14> be generated with sufficient entropy (at least 128 bits) and rotated periodically. Tokens <bcp14>SHOULD</bcp14> be scoped to a single MTA identity.</t>
  <t>Mutual TLS: Provides strong authentication and binds identity to transport security. <bcp14>RECOMMENDED</bcp14> for high-trust deployments.</t>
  <t>HMAC signatures: Allows authentication without transmitting bearer secrets; requires secure key distribution.</t>
</list></t>

<t>Authorization policies at the scanner <bcp14>SHOULD</bcp14> restrict, per-MTA-identity, which stages may be subscribed to, which properties may be requested, and which actions may be performed. Policies <bcp14>SHOULD</bcp14> be enforced both at registration time (rejecting impermissible registrations) and at hook-response time (ignoring out-of-policy modifications).</t>

</section>
<section anchor="credential-provisioning"><name>Credential Provisioning</name>

<t>Scanner operators issue credentials to MTA operators through an out-of-band channel that this specification does not define. Credential provisioning practices <bcp14>SHOULD</bcp14> include:</t>

<t><list style="symbols">
  <t>Per-MTA-instance credentials (avoid shared secrets across multiple MTAs).</t>
  <t>Credential rotation on a defined cadence.</t>
  <t>Immediate revocation when an MTA instance is decommissioned or compromised.</t>
  <t>Storage of credentials at the MTA in protected configuration that is not logged or exported with diagnostics.</t>
</list></t>

<t>Scanner-issued credentials <bcp14>SHOULD</bcp14> encode the MTA identity in a way that survives renewal of the underlying secret (for example, a stable client-certificate Subject CN, or a tenant identifier conveyed alongside a rotated bearer token).</t>

</section>
<section anchor="transport-security"><name>Transport Security</name>

<t>All MTA Hooks communications <bcp14>MUST</bcp14> use TLS to protect message content and authentication credentials in transit. Implementations <bcp14>MUST</bcp14> validate certificates to prevent man-in-the-middle attacks.</t>

<t>For internal network deployments, administrators may choose to use private certificate authorities. However, disabling certificate validation is <bcp14>NOT RECOMMENDED</bcp14> even for internal communications.</t>

</section>
<section anchor="message-confidentiality"><name>Message Confidentiality</name>

<t>Email messages frequently contain sensitive personal or business information. Scanners necessarily receive access to message content to perform their functions. Deployments <bcp14>SHOULD</bcp14> consider:</t>

<t><list style="symbols">
  <t>Data handling policies for scanner operators</t>
  <t>Logging policies that avoid recording message content</t>
  <t>Data retention limits at scanner endpoints</t>
  <t>Regulatory requirements such as GDPR for personal data processing</t>
</list></t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<section anchor="registration-flood"><name>Registration Flood</name>

<t>Although the registration endpoint is on the scanner, an attacker that obtains valid MTA credentials could flood the scanner with registration churn. Scanners <bcp14>SHOULD</bcp14>:</t>

<t><list style="symbols">
  <t>Authenticate before parsing any registration body.</t>
  <t>Rate limit registration and deregistration per MTA identity.</t>
  <t>Limit maximum concurrent registrations per MTA identity.</t>
  <t>Apply the same protections to the discovery endpoint, which is unauthenticated by design.</t>
</list></t>

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

<t>A compromised or misconfigured MTA could overwhelm a scanner with hook requests. Scanners <bcp14>SHOULD</bcp14>:</t>

<t><list style="symbols">
  <t>Implement per-registration rate limiting and concurrency caps.</t>
  <t>Set appropriate request body size limits, advertised in the discovery document.</t>
  <t>Monitor for unusual invocation patterns and suspend offending registrations.</t>
</list></t>

</section>
<section anchor="slow-scanner-attacks"><name>Slow Scanner Attacks</name>

<t>Slow scanner responses can exhaust MTA resources (connection slots, memory, queued mail). MTAs <bcp14>SHOULD</bcp14>:</t>

<t><list style="symbols">
  <t>Enforce strict timeouts; never wait indefinitely for a hook response.</t>
  <t>Limit concurrent requests to any single scanner.</t>
  <t>Implement circuit breaker patterns for repeatedly slow or failing scanners.</t>
</list></t>

</section>
<section anchor="compromised-scanner"><name>Compromised Scanner</name>

<t>A compromised scanner can attempt to coerce the MTA into mishandling mail by returning malicious modifications. The MTA's defense in depth is to enforce its declared <spanx style="verb">updateProperties</spanx> strictly, validate every modification (<xref target="injection-attacks"/>), and reject responses that violate the negotiated capabilities. The MTA <bcp14>SHOULD NOT</bcp14> depend on the scanner to behave honestly.</t>

</section>
</section>
<section anchor="injection-attacks"><name>Injection Attacks</name>

<t>Scanner responses contain modifications applied to message processing. Implementations <bcp14>MUST</bcp14> validate all scanner-provided data:</t>

<t><list style="symbols">
  <t>Header names and values <bcp14>MUST</bcp14> be validated to prevent header injection (CR/LF smuggling, malformed encoded-words, header folding abuse).</t>
  <t>Recipient addresses <bcp14>MUST</bcp14> be syntactically validated and re-checked against MTA policy before being added to the envelope.</t>
  <t>Body modifications <bcp14>MUST</bcp14> not introduce malformed MIME structure or content that violates declared character sets.</t>
  <t>Modifications targeting paths outside the registration's negotiated <spanx style="verb">updateProperties</spanx> <bcp14>MUST</bcp14> be discarded.</t>
</list></t>

</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>

<t>Email processing inherently involves access to personal communications. Implementations <bcp14>SHOULD</bcp14> minimize data exposure:</t>

<t><list style="symbols">
  <t>Scanners <bcp14>SHOULD</bcp14> request only necessary properties</t>
  <t>MTAs <bcp14>SHOULD</bcp14> honor property restrictions from capability negotiation</t>
  <t>Logging <bcp14>SHOULD</bcp14> avoid recording message content or metadata</t>
  <t>Scanner operators <bcp14>SHOULD</bcp14> implement appropriate data protection measures</t>
</list></t>

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

<section anchor="well-known-uri-registration"><name>Well-Known URI Registration</name>

<t>This document registers the following well-known URI per <xref target="RFC8615"/>:</t>

<t>URI suffix: mta-hooks</t>

<t>Change controller: IETF</t>

<t>Specification document: This document</t>

<t>Status: permanent</t>

<t>Related information: N/A</t>

</section>
<section anchor="mta-hooks-serialization-format-registry"><name>MTA Hooks Serialization Format Registry</name>

<t>IANA is requested to create a new registry entitled "MTA Hooks Serialization Formats" with the following initial contents:</t>

<t><list style="symbols">
  <t>Format: json
  <list style="symbols">
      <t>Description: JSON serialization per RFC 8259</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Format: cbor
  <list style="symbols">
      <t>Description: CBOR serialization per RFC 8949</t>
      <t>Reference: This document</t>
    </list></t>
</list></t>

<t>New registrations require Specification Required per <xref target="RFC8126"/>.</t>

</section>
<section anchor="mta-hooks-inbound-action-registry"><name>MTA Hooks Inbound Action Registry</name>

<t>IANA is requested to create a new registry entitled "MTA Hooks Inbound Actions" with the following initial contents:</t>

<t><list style="symbols">
  <t>Action: accept
  <list style="symbols">
      <t>Description: Accept message for delivery</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Action: reject
  <list style="symbols">
      <t>Description: Reject message with error response</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Action: discard
  <list style="symbols">
      <t>Description: Accept but do not deliver message</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Action: quarantine
  <list style="symbols">
      <t>Description: Place message in quarantine</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Action: disconnect
  <list style="symbols">
      <t>Description: Terminate SMTP connection</t>
      <t>Reference: This document</t>
    </list></t>
</list></t>

<t>New registrations require Specification Required per <xref target="RFC8126"/>.</t>

</section>
<section anchor="mta-hooks-outbound-action-registry"><name>MTA Hooks Outbound Action Registry</name>

<t>IANA is requested to create a new registry entitled "MTA Hooks Outbound Actions" with the following initial contents:</t>

<t><list style="symbols">
  <t>Action: continue
  <list style="symbols">
      <t>Description: Proceed with normal delivery processing</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Action: cancel
  <list style="symbols">
      <t>Description: Cancel pending deliveries</t>
      <t>Reference: This document</t>
    </list></t>
</list></t>

<t>New registrations require Specification Required per <xref target="RFC8126"/>.</t>

</section>
<section anchor="mta-hooks-inbound-stage-registry"><name>MTA Hooks Inbound Stage Registry</name>

<t>IANA is requested to create a new registry entitled "MTA Hooks Inbound Stages" with the following initial contents:</t>

<t><list style="symbols">
  <t>Stage: connect
  <list style="symbols">
      <t>Description: Client connection established</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Stage: ehlo
  <list style="symbols">
      <t>Description: EHLO/HELO command received</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Stage: mail
  <list style="symbols">
      <t>Description: MAIL FROM command received</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Stage: rcpt
  <list style="symbols">
      <t>Description: RCPT TO command received</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Stage: data
  <list style="symbols">
      <t>Description: Message content received</t>
      <t>Reference: This document</t>
    </list></t>
</list></t>

<t>New registrations require Specification Required per <xref target="RFC8126"/>.</t>

</section>
<section anchor="mta-hooks-outbound-stage-registry"><name>MTA Hooks Outbound Stage Registry</name>

<t>IANA is requested to create a new registry entitled "MTA Hooks Outbound Stages" with the following initial contents:</t>

<t><list style="symbols">
  <t>Stage: delivery
  <list style="symbols">
      <t>Description: Delivery attempt completed</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Stage: defer
  <list style="symbols">
      <t>Description: Delivery deferred for retry</t>
      <t>Reference: This document</t>
    </list></t>
  <t>Stage: dsn
  <list style="symbols">
      <t>Description: DSN generation pending</t>
      <t>Reference: This document</t>
    </list></t>
</list></t>

<t>New registrations require Specification Required per <xref target="RFC8126"/>.</t>

</section>
<section anchor="mta-hooks-error-code-registry"><name>MTA Hooks Error Code Registry</name>

<t>IANA is requested to create a new registry entitled "MTA Hooks Error Codes" with the initial contents specified in <xref target="error-codes"/>.</t>

<t>New registrations require Specification Required per <xref target="RFC8126"/>.</t>

</section>
</section>


  </middle>

  <back>


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

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



<reference anchor="RFC5321">
  <front>
    <title>Simple Mail Transfer Protocol</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <date month="October" year="2008"/>
    <abstract>
      <t>This document is a specification of the basic protocol for Internet electronic mail transport. It consolidates, updates, and clarifies several previous documents, making all or parts of most of them obsolete. It covers the SMTP extension mechanisms and best practices for the contemporary Internet, but does not provide details about particular extensions. Although SMTP was designed as a mail transport and delivery protocol, this specification also contains information that is important to its use as a "mail submission" protocol for "split-UA" (User Agent) mail reading systems and mobile environments. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5321"/>
  <seriesInfo name="DOI" value="10.17487/RFC5321"/>
</reference>
<reference anchor="RFC5322">
  <front>
    <title>Internet Message Format</title>
    <author fullname="P. Resnick" initials="P." role="editor" surname="Resnick"/>
    <date month="October" year="2008"/>
    <abstract>
      <t>This document specifies the Internet Message Format (IMF), a syntax for text messages that are sent between computer users, within the framework of "electronic mail" messages. This specification is a revision of Request For Comments (RFC) 2822, which itself superseded Request For Comments (RFC) 822, "Standard for the Format of ARPA Internet Text Messages", updating it to reflect current practice and incorporating incremental changes that were specified in other RFCs. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5322"/>
  <seriesInfo name="DOI" value="10.17487/RFC5322"/>
</reference>
<reference anchor="RFC6901">
  <front>
    <title>JavaScript Object Notation (JSON) Pointer</title>
    <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
    <author fullname="K. Zyp" initials="K." surname="Zyp"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <date month="April" year="2013"/>
    <abstract>
      <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6901"/>
  <seriesInfo name="DOI" value="10.17487/RFC6901"/>
</reference>
<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC8620">
  <front>
    <title>The JSON Meta Application Protocol (JMAP)</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2019"/>
    <abstract>
      <t>This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8620"/>
  <seriesInfo name="DOI" value="10.17487/RFC8620"/>
</reference>
<reference anchor="RFC8621">
  <front>
    <title>The JSON Meta Application Protocol (JMAP) for Mail</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="August" year="2019"/>
    <abstract>
      <t>This document specifies a data model for synchronising email data with a server using the JSON Meta Application Protocol (JMAP). Clients can use this to efficiently search, access, organise, and send messages, and to get push notifications for fast resynchronisation when new messages are delivered or a change is made in another client.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8621"/>
  <seriesInfo name="DOI" value="10.17487/RFC8621"/>
</reference>
<reference anchor="RFC8949">
  <front>
    <title>Concise Binary Object Representation (CBOR)</title>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <date month="December" year="2020"/>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
      <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="94"/>
  <seriesInfo name="RFC" value="8949"/>
  <seriesInfo name="DOI" value="10.17487/RFC8949"/>
</reference>
<reference anchor="RFC3339">
  <front>
    <title>Date and Time on the Internet: Timestamps</title>
    <author fullname="G. Klyne" initials="G." surname="Klyne"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2002"/>
    <abstract>
      <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3339"/>
  <seriesInfo name="DOI" value="10.17487/RFC3339"/>
</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>
<reference anchor="RFC3986">
  <front>
    <title>Uniform Resource Identifier (URI): Generic Syntax</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <date month="January" year="2005"/>
    <abstract>
      <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="66"/>
  <seriesInfo name="RFC" value="3986"/>
  <seriesInfo name="DOI" value="10.17487/RFC3986"/>
</reference>
<reference anchor="RFC3463">
  <front>
    <title>Enhanced Mail System Status Codes</title>
    <author fullname="G. Vaudreuil" initials="G." surname="Vaudreuil"/>
    <date month="January" year="2003"/>
    <abstract>
      <t>This document defines a set of extended status codes for use within the mail system for delivery status reports, tracking, and improved diagnostics. In combination with other information provided in the Delivery Status Notification (DSN) delivery report, these codes facilitate media and language independent rendering of message delivery status. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3463"/>
  <seriesInfo name="DOI" value="10.17487/RFC3463"/>
</reference>
<reference anchor="RFC9112">
  <front>
    <title>HTTP/1.1</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
      <t>This document obsoletes portions of RFC 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="99"/>
  <seriesInfo name="RFC" value="9112"/>
  <seriesInfo name="DOI" value="10.17487/RFC9112"/>
</reference>
<reference anchor="RFC9113">
  <front>
    <title>HTTP/2</title>
    <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
    <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
      <t>This document obsoletes RFCs 7540 and 8740.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9113"/>
  <seriesInfo name="DOI" value="10.17487/RFC9113"/>
</reference>
<reference anchor="RFC9114">
  <front>
    <title>HTTP/3</title>
    <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9114"/>
  <seriesInfo name="DOI" value="10.17487/RFC9114"/>
</reference>
<reference anchor="RFC5246">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
    <author fullname="T. Dierks" initials="T." surname="Dierks"/>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2008"/>
    <abstract>
      <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5246"/>
  <seriesInfo name="DOI" value="10.17487/RFC5246"/>
</reference>
<reference anchor="RFC8446">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2018"/>
    <abstract>
      <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8446"/>
  <seriesInfo name="DOI" value="10.17487/RFC8446"/>
</reference>
<reference anchor="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</reference>
<reference anchor="RFC8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</reference>



    </references>

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



<reference anchor="RFC3461">
  <front>
    <title>Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery Status Notifications (DSNs)</title>
    <author fullname="K. Moore" initials="K." surname="Moore"/>
    <date month="January" year="2003"/>
    <abstract>
      <t>This memo defines an extension to the Simple Mail Transfer Protocol (SMTP) service, which allows an SMTP client to specify (a) that Delivery Status Notifications (DSNs) should be generated under certain conditions, (b) whether such notifications should return the contents of the message, and (c) additional information, to be returned with a DSN, that allows the sender to identify both the recipient(s) for which the DSN was issued, and the transaction in which the original message was sent. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3461"/>
  <seriesInfo name="DOI" value="10.17487/RFC3461"/>
</reference>
<reference anchor="RFC6376">
  <front>
    <title>DomainKeys Identified Mail (DKIM) Signatures</title>
    <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
    <author fullname="T. Hansen" initials="T." role="editor" surname="Hansen"/>
    <author fullname="M. Kucherawy" initials="M." role="editor" surname="Kucherawy"/>
    <date month="September" year="2011"/>
    <abstract>
      <t>DomainKeys Identified Mail (DKIM) permits a person, role, or organization that owns the signing domain to claim some responsibility for a message by associating the domain with the message. This can be an author's organization, an operational relay, or one of their agents. DKIM separates the question of the identity of the Signer of the message from the purported author of the message. Assertion of responsibility is validated through a cryptographic signature and by querying the Signer's domain directly to retrieve the appropriate public key. Message transit from author to recipient is through relays that typically make no substantive change to the message content and thus preserve the DKIM signature.</t>
      <t>This memo obsoletes RFC 4871 and RFC 5672. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="76"/>
  <seriesInfo name="RFC" value="6376"/>
  <seriesInfo name="DOI" value="10.17487/RFC6376"/>
</reference>
<reference anchor="RFC7208">
  <front>
    <title>Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1</title>
    <author fullname="S. Kitterman" initials="S." surname="Kitterman"/>
    <date month="April" year="2014"/>
    <abstract>
      <t>Email on the Internet can be forged in a number of ways. In particular, existing protocols place no restriction on what a sending host can use as the "MAIL FROM" of a message or the domain given on the SMTP HELO/EHLO commands. This document describes version 1 of the Sender Policy Framework (SPF) protocol, whereby ADministrative Management Domains (ADMDs) can explicitly authorize the hosts that are allowed to use their domain names, and a receiving host can check such authorization.</t>
      <t>This document obsoletes RFC 4408.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7208"/>
  <seriesInfo name="DOI" value="10.17487/RFC7208"/>
</reference>
<reference anchor="RFC7489">
  <front>
    <title>Domain-based Message Authentication, Reporting, and Conformance (DMARC)</title>
    <author fullname="M. Kucherawy" initials="M." role="editor" surname="Kucherawy"/>
    <author fullname="E. Zwicky" initials="E." role="editor" surname="Zwicky"/>
    <date month="March" year="2015"/>
    <abstract>
      <t>Domain-based Message Authentication, Reporting, and Conformance (DMARC) is a scalable mechanism by which a mail-originating organization can express domain-level policies and preferences for message validation, disposition, and reporting, that a mail-receiving organization can use to improve mail handling.</t>
      <t>Originators of Internet Mail need to be able to associate reliable and authenticated domain identifiers with messages, communicate policies about messages that use those identifiers, and report about mail using those identifiers. These abilities have several benefits: Receivers can provide feedback to Domain Owners about the use of their domains; this feedback can provide valuable insight about the management of internal operations and the presence of external domain name abuse.</t>
      <t>DMARC does not produce or encourage elevated delivery privilege of authenticated email. DMARC is a mechanism for policy distribution that enables increasingly strict handling of messages that fail authentication checks, ranging from no action, through altered delivery, up to message rejection.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7489"/>
  <seriesInfo name="DOI" value="10.17487/RFC7489"/>
</reference>



    </references>

</references>


<?line 1966?>

<section anchor="error-codes"><name>Error Codes</name>

<t>This appendix defines error codes used in MTA Hooks error responses.</t>

<section anchor="error-response-structure"><name>Error Response Structure</name>

<t>Error responses use the following structure:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "error": {
    "code": "ERROR_CODE",
    "message": "Human-readable error description"
  }
}
]]></sourcecode></figure>

</section>
<section anchor="http-400-bad-request"><name>HTTP 400 Bad Request</name>

<t><list style="symbols">
  <t>INVALID_REQUEST: Malformed JSON or CBOR, or missing required fields.</t>
  <t>CAPABILITY_MISMATCH: Requested capability not supported by the scanner.</t>
  <t>INVALID_STAGE: One or more requested stages are not valid.</t>
  <t>INVALID_ACTION: One or more requested actions are not valid.</t>
  <t>INVALID_MODIFICATION: One or more requested modifications are not valid.</t>
  <t>NO_STAGES_REQUESTED: Neither inbound nor outbound stages were specified.</t>
  <t>FILTER_INVALID: Filter configuration is syntactically invalid.</t>
  <t>MISSING_REQUEST_ID: The X-MTA-Hooks-Request-Id header is missing on a hook invocation.</t>
</list></t>

</section>
<section anchor="http-401-unauthorized"><name>HTTP 401 Unauthorized</name>

<t><list style="symbols">
  <t>AUTHENTICATION_REQUIRED: No authentication credentials provided.</t>
  <t>INVALID_CREDENTIALS: Provided credentials are invalid or expired.</t>
</list></t>

</section>
<section anchor="http-403-forbidden"><name>HTTP 403 Forbidden</name>

<t><list style="symbols">
  <t>REGISTRATION_DENIED: Valid credentials but the MTA identity is not authorized to register.</t>
  <t>DOMAIN_NOT_ALLOWED: MTA not authorized for the requested domains.</t>
  <t>REGISTRATION_MISMATCH: The credentials are not bound to the registration identified by X-MTA-Hooks-Registration.</t>
</list></t>

</section>
<section anchor="http-404-not-found"><name>HTTP 404 Not Found</name>

<t><list style="symbols">
  <t>REGISTRATION_NOT_FOUND: No registration exists with the specified identifier.</t>
</list></t>

</section>
<section anchor="http-409-conflict"><name>HTTP 409 Conflict</name>

<t><list style="symbols">
  <t>REGISTRATION_LIMIT_REACHED: Maximum number of registrations for this MTA identity exceeded.</t>
</list></t>

</section>
<section anchor="http-410-gone"><name>HTTP 410 Gone</name>

<t><list style="symbols">
  <t>REGISTRATION_DEREGISTERED: The registration has been deregistered and will not be re-activated.</t>
</list></t>

</section>
<section anchor="http-413-content-too-large"><name>HTTP 413 Content Too Large</name>

<t><list style="symbols">
  <t>REQUEST_TOO_LARGE: The request body exceeds the scanner's advertised maxMessageSize.</t>
</list></t>

</section>
<section anchor="http-422-unprocessable-content"><name>HTTP 422 Unprocessable Content</name>

<t><list style="symbols">
  <t>UNSUPPORTED_FILTER: The filter contains conditions that are not supported by this scanner.</t>
  <t>UNSUPPORTED_PROPERTY: One or more requested properties are not in the scanner's advertised fetchProperties.</t>
</list></t>

</section>
<section anchor="http-429-too-many-requests"><name>HTTP 429 Too Many Requests</name>

<t><list style="symbols">
  <t>RATE_LIMITED: Too many requests; retry after the time specified in the Retry-After header.</t>
</list></t>

</section>
<section anchor="http-500-internal-server-error"><name>HTTP 500 Internal Server Error</name>

<t><list style="symbols">
  <t>INTERNAL_ERROR: Unexpected server error during processing.</t>
</list></t>

</section>
<section anchor="http-503-service-unavailable"><name>HTTP 503 Service Unavailable</name>

<t><list style="symbols">
  <t>REGISTRATION_DISABLED: Registration temporarily disabled by administrator.</t>
  <t>SCANNER_UNAVAILABLE: The scanner is temporarily unable to process hook invocations.</t>
</list></t>

</section>
</section>
<section anchor="complete-example-flows"><name>Complete Example Flows</name>

<t>This appendix provides complete request and response examples for common scenarios.</t>

<section anchor="inbound-spam-filtering"><name>Inbound Spam Filtering</name>

<t>This example shows a complete flow for spam filtering during inbound message reception.</t>

<section anchor="discovery-1"><name>Discovery</name>

<figure><artwork><![CDATA[
GET /.well-known/mta-hooks HTTP/1.1
Host: scanner.example.com
Accept: application/json
]]></artwork></figure>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "version": "1.0",
  "endpoints": {
    "registration": "/v1/hooks/register",
    "deregistration": "/v1/hooks/register/{registration_id}"
  },
  "serialization": ["json"],
  "capabilities": {
    "inbound": {
      "stages": ["data"],
      "actions": ["accept", "reject", "quarantine"],
      "fetchProperties": ["/message", "/envelope", "/senderAuth",
                          "/client"],
      "updateProperties": ["/message/headers", "/action", "/response"]
    }
  },
  "limits": {
    "maxMessageSize": 26214400,
    "timeoutMs": 30000
  }
}
]]></artwork></figure>

</section>
<section anchor="registration-1"><name>Registration</name>

<figure><artwork><![CDATA[
POST /v1/hooks/register HTTP/1.1
Host: scanner.example.com
Content-Type: application/json
Authorization: Bearer sk_live_abc123

{
  "name": "Acme MTA mx1",
  "version": "3.0.1",
  "timeoutMs": 20000,
  "serialization": "json",
  "inbound": {
    "stages": ["data"],
    "properties": ["/message", "/envelope", "/senderAuth", "/client"]
  },
  "metadata": {
    "operator": "acme-corp"
  }
}
]]></artwork></figure>

</section>
<section anchor="registration-response-1"><name>Registration Response</name>

<figure><artwork><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json
Location: /v1/hooks/register/reg_spam_001

{
  "registrationId": "reg_spam_001",
  "status": "active",
  "createdAt": "2024-12-21T10:00:00Z",
  "expiresAt": "2025-01-21T10:00:00Z",
  "hookEndpoint": "/v1/hooks/invoke/reg_spam_001",
  "negotiated": {
    "serialization": "json",
    "inbound": {
      "stages": ["data"],
      "properties": ["/message", "/envelope", "/senderAuth", "/client"]
    }
  },
  "endpoints": {
    "deregistration": "/v1/hooks/register/reg_spam_001",
    "status": "/v1/hooks/register/reg_spam_001/status"
  }
}
]]></artwork></figure>

</section>
<section anchor="hook-invocation-clean-message"><name>Hook Invocation - Clean Message</name>

<figure><artwork><![CDATA[
POST /v1/hooks/invoke/reg_spam_001 HTTP/1.1
Host: scanner.example.com
Content-Type: application/json
Authorization: Bearer sk_live_abc123
X-MTA-Hooks-Registration: reg_spam_001
X-MTA-Hooks-Request-Id: 01HZ8K3X7F4Y5N6Q9R2S3T4U5V

{
  "stage": "data",
  "action": "accept",
  "timestamp": "2024-12-21T10:30:00Z",
  "response": {
    "code": 250,
    "enhancedCode": "2.0.0",
    "message": "OK"
  },
  "envelope": {
    "from": {"address": "alice@sender.example", "parameters": {}},
    "to": [{"address": "bob@recipient.example", "parameters": {}}]
  },
  "message": {
    "subject": "Quarterly Report",
    "from": [{"email": "alice@sender.example", "name": "Alice Smith"}],
    "to": [{"email": "bob@recipient.example"}],
    "size": 15360,
    "bodyValues": {
      "1": {
        "value": "Please find attached the Q4 report...",
        "isEncodingProblem": false,
        "isTruncated": false
      }
    }
  },
  "senderAuth": {
    "spf-mail": "pass",
    "dkim": "pass",
    "dmarc": "pass"
  },
  "client": {
    "ip": "192.0.2.50",
    "ehlo": "mail.sender.example"
  }
}
]]></artwork></figure>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "add": [
    {
      "path": "/message/headers",
      "value": {"name": "X-Spam-Status", "value": "No, score=0.5"},
      "index": 0
    }
  ]
}
]]></artwork></figure>

</section>
<section anchor="hook-invocation-spam-detected"><name>Hook Invocation - Spam Detected</name>

<figure><artwork><![CDATA[
POST /v1/hooks/invoke/reg_spam_001 HTTP/1.1
Host: scanner.example.com
Content-Type: application/json
Authorization: Bearer sk_live_abc123
X-MTA-Hooks-Registration: reg_spam_001
X-MTA-Hooks-Request-Id: 01HZ8KAW6D2E3F4G5H6J7K8L9M

{
  "stage": "data",
  "action": "accept",
  "timestamp": "2024-12-21T10:35:00Z",
  "response": {
    "code": 250,
    "enhancedCode": "2.0.0",
    "message": "OK"
  },
  "envelope": {
    "from": {"address": "promo@spammer.invalid", "parameters": {}},
    "to": [{"address": "bob@recipient.example", "parameters": {}}]
  },
  "message": {
    "subject": "YOU HAVE WON $1,000,000!!!",
    "from": [{"email": "winner@lottery.invalid"}],
    "to": [{"email": "bob@recipient.example"}],
    "size": 8192
  },
  "senderAuth": {
    "spf-mail": "fail",
    "dkim": "none",
    "dmarc": "fail"
  },
  "client": {
    "ip": "203.0.113.99",
    "ehlo": "totally-legit.invalid"
  }
}
]]></artwork></figure>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "set": [
    {
      "path": "/action",
      "value": "reject"
    },
    {
      "path": "/response",
      "value": {
        "code": 550,
        "enhancedCode": "5.7.1",
        "message": "Message rejected due to spam content"
      }
    }
  ]
}
]]></artwork></figure>

</section>
</section>
<section anchor="outbound-delivery-logging"><name>Outbound Delivery Logging</name>

<t>This example shows outbound hook usage for delivery status logging and compliance.</t>

<section anchor="registration-2"><name>Registration</name>

<figure><artwork><![CDATA[
POST /v1/hooks/register HTTP/1.1
Host: logger.example.net
Content-Type: application/json
Authorization: Bearer sk_live_def456

{
  "name": "Acme MTA mx1",
  "version": "1.0.0",
  "timeoutMs": 5000,
  "serialization": "json",
  "outbound": {
    "stages": ["delivery", "dsn"],
    "properties": null
  }
}
]]></artwork></figure>

<figure><artwork><![CDATA[
HTTP/1.1 201 Created
Content-Type: application/json

{
  "registrationId": "reg_logger_001",
  "status": "active",
  "createdAt": "2024-12-21T11:00:00Z",
  "hookEndpoint": "/v1/hooks/invoke/reg_logger_001",
  "negotiated": {
    "serialization": "json",
    "outbound": {
      "stages": ["delivery", "dsn"],
      "properties": ["/envelope", "/message", "/queue", "/server"]
    }
  },
  "endpoints": {
    "deregistration": "/v1/hooks/register/reg_logger_001",
    "status": "/v1/hooks/register/reg_logger_001/status"
  }
}
]]></artwork></figure>

</section>
<section anchor="hook-invocation-partial-delivery"><name>Hook Invocation - Partial Delivery</name>

<figure><artwork><![CDATA[
POST /v1/hooks/invoke/reg_logger_001 HTTP/1.1
Host: logger.example.net
Content-Type: application/json
Authorization: Bearer sk_live_def456
X-MTA-Hooks-Registration: reg_logger_001
X-MTA-Hooks-Request-Id: 01HZ8MBN5Q4R3S2T1U0V9W8X7Y

{
  "stage": "delivery",
  "action": "continue",
  "timestamp": "2024-12-21T12:00:00Z",
  "queue": {
    "id": "q_msg_12345",
    "expiresAt": "2024-12-24T12:00:00Z",
    "attempts": 1
  },
  "envelope": {
    "from": {"address": "notify@example.com", "parameters": {}},
    "to": [
      {
        "address": "user1@active.example",
        "parameters": {},
        "status": "delivered",
        "attempt": 1,
        "lastResponse": {
          "code": 250,
          "enhancedCode": "2.0.0",
          "message": "Delivered"
        }
      },
      {
        "address": "user2@slow.example",
        "parameters": {},
        "status": "deferred",
        "attempt": 1,
        "lastResponse": {
          "code": 451,
          "enhancedCode": "4.7.1",
          "message": "Greylisted, try again"
        },
        "nextAttemptAt": "2024-12-21T12:15:00Z"
      },
      {
        "address": "user3@invalid.example",
        "parameters": {},
        "status": "failed",
        "attempt": 1,
        "lastResponse": {
          "code": 550,
          "enhancedCode": "5.1.1",
          "message": "User unknown"
        }
      }
    ]
  },
  "message": {
    "subject": "System Notification",
    "messageId": "<notify-12345@example.com>",
    "size": 2048
  }
}
]]></artwork></figure>

<figure><artwork><![CDATA[
HTTP/1.1 204 No Content
]]></artwork></figure>

</section>
</section>
<section anchor="deregistration-1"><name>Deregistration</name>

<figure><artwork><![CDATA[
DELETE /v1/hooks/register/reg_spam_001 HTTP/1.1
Host: scanner.example.com
Authorization: Bearer sk_live_abc123
]]></artwork></figure>

<figure><artwork><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "registrationId": "reg_spam_001",
  "status": "deregistered",
  "deregisteredAt": "2024-12-21T18:00:00Z"
}
]]></artwork></figure>

</section>
</section>
<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>The authors thank the developers and operators of existing mail filtering systems whose experience informed this design.</t>

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

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

<t><strong>draft-degennaro-mta-hooks-01</strong></t>

<t><list style="symbols">
  <t>Inverted the registration model: the MTA is now exclusively the HTTP client. The registration, status, and deregistration endpoints reside at the scanner; the MTA no longer exposes any HTTP server to scanners.</t>
  <t>Removed the callback URL concept and callback verification handshake. The scanner's hook endpoint is returned in the registration response.</t>
  <t>Required X-MTA-Hooks-Registration on every hook invocation. Added X-MTA-Hooks-Request-Id for safe deduplication on retry.</t>
  <t>Specified authentication requirements for hook invocations and credential provisioning practices.</t>
  <t>Specified the error response contract for hook invocations and the status code semantics.</t>
  <t>Clarified action precedence in multi-scanner chains and removed the duplicate Multiple Scanner Handling section.</t>
  <t>Replaced "Modification Order" duplication with a forward reference.</t>
  <t>Documented the failed-silent recipient status.</t>
  <t>Corrected the enhanced status code reference from RFC 3461 to RFC 3463.</t>
  <t>Clarified filter conditions: minSize and maxSize are permitted; the confused reference to Section 4.1.1 of RFC 8621 has been removed.</t>
  <t>Replaced callback-related error codes (CALLBACK_UNREACHABLE, CALLBACK_VERIFICATION_FAILED, TLS_REQUIRED, TLS_CERTIFICATE_INVALID, INVALID_CALLBACK_URL, CALLBACK_NOT_ALLOWED, ALREADY_REGISTERED) with codes appropriate to the new model (REGISTRATION_MISMATCH, REGISTRATION_DEREGISTERED, REQUEST_TOO_LARGE, UNSUPPORTED_PROPERTY, MISSING_REQUEST_ID, SCANNER_UNAVAILABLE).</t>
  <t>Rewrote Security Considerations around the new trust model and credential provisioning.</t>
</list></t>

<t><strong>draft-degennaro-mta-hooks-00</strong></t>

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

</section>


  </back>

<!-- ##markdown-source:
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
pU7n/wIyjl7q1VIBAA==

-->

</rfc>

