<?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.38 (Ruby 3.2.11) -->


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

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC3339 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8785 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
<!ENTITY RFC7235 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7235.xml">
]>


<rfc ipr="noModificationTrust200902" docName="draft-stripe-charge-00" category="info" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="Stripe Charge">Stripe charge Intent for HTTP Payment Authentication</title>

    <author initials="B." surname="Ryan" fullname="Brendan Ryan">
      <organization>Tempo Labs</organization>
      <address>
        <email>brendan@tempo.xyz</email>
      </address>
    </author>
    <author initials="S." surname="Kaliski" fullname="Steve Kaliski">
      <organization>Stripe</organization>
      <address>
        <email>stevekaliski@stripe.com</email>
      </address>
    </author>

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

    
    
    

    <abstract>


<?line 47?>

<t>This document defines the "charge" intent for the Stripe payment method
within the Payment HTTP Authentication Scheme <xref target="I-D.httpauth-payment"/>.
It specifies how clients and servers exchange one-time payments using
Shared Payment Tokens (SPTs).</t>



    </abstract>



  </front>

  <middle>


<?line 54?>

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

<t>This specification defines the "charge" intent for use with the Stripe
payment method in the Payment HTTP Authentication Scheme
<xref target="I-D.httpauth-payment"/>. The charge intent enables one-time payments
where the server processes the payment immediately upon receiving a
Shared Payment Token (SPT).</t>

<t>Stripe provides payment processing through SPTs, which are single-use
tokens that represent payment authorization. SPTs abstract away the
complexity of payment method details (cards, bank accounts, wallets)
and provide a unified interface for payment acceptance.</t>

<section anchor="stripe-charge-flow"><name>Stripe Charge Flow</name>

<t>The following diagram illustrates the Stripe charge payment flow:</t>

<figure><artwork><![CDATA[
   Client                          Server                          Stripe
      |                               |                               |
      |  (1) GET /resource            |                               |
      |---------------------------->  |                               |
      |                               |                               |
      |  (2) 402 Payment Required     |                               |
      |      intent="charge",         |                               |
      |      request=<base64url>      |                               |
      |<----------------------------- |                               |
      |                               |                               |
      |  (3) Collect payment method   |                               |
      |      via Stripe.js and        |                               |
      |      generate SPT             |                               |
      |      (may prompt for 3DS,     |                               |
      |      biometrics, etc.)        |                               |
      |------------------------------------------------------------>  |
      |                               |                               |
      |  (4) Authorization:           |                               |
      |      Payment <credential>     |                               |
      |---------------------------->  |                               |
      |                               |  (5) Create PaymentIntent     |
      |                               |      (Stripe API, using SPT)  |
      |                               |---------------------------->  |
      |                               |                               |
      |  (6) 200 OK                   |                               |
      |      Payment-Receipt:         |                               |
      |      <receipt>                |                               |
      |<----------------------------  |                               |
      |                               |                               |
]]></artwork></figure>

</section>
<section anchor="relationship-to-the-payment-scheme"><name>Relationship to the Payment Scheme</name>

<t>This document is a payment method intent specification as defined in
<xref target="I-D.httpauth-payment"/>. It defines the <spanx style="verb">request</spanx> and
<spanx style="verb">payload</spanx> structures for the <spanx style="verb">charge</spanx> intent of the <spanx style="verb">stripe</spanx> payment
method, along with verification and settlement procedures.</t>

</section>
</section>
<section anchor="requirements-language"><name>Requirements Language</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>

<dl>
  <dt>Shared Payment Token (SPT)</dt>
  <dd>
    <t>A single-use token (prefixed with <spanx style="verb">spt_</spanx>) that represents authorization
to charge a payment method. SPTs are created by clients using the
Stripe API and consumed by servers to process payments. Both the Client
and Server require a Stripe account. In the Stripe API, SPTs are
referenced as <spanx style="verb">shared_payment_granted_token</spanx> on PaymentIntent creation.
See <xref target="STRIPE-SPT"/>.</t>
  </dd>
  <dt>Business Network Profile</dt>
  <dd>
    <t>A Stripe profile is a business’s public identity on Stripe. With a Stripe profile,
businesses can find, verify, and connect with each other on Stripe.
Learn more: https://docs.stripe.com/get-started/account/profile</t>
  </dd>
  <dt>Payment Intent</dt>
  <dd>
    <t>A Stripe API object that tracks the lifecycle of a customer payment,
from creation through settlement. Not to be confused with the HTTP
Payment Auth protocol's "payment intent" parameter.
Learn more: https://docs.stripe.com/payments/payment-intents</t>
  </dd>
</dl>

</section>
<section anchor="intent-identifier"><name>Intent Identifier</name>

<t>This specification defines the following intent for the <spanx style="verb">stripe</spanx> payment
method:</t>

<figure><artwork><![CDATA[
charge
]]></artwork></figure>

<t>The intent identifier is case-sensitive and <bcp14>MUST</bcp14> be lowercase.</t>

</section>
<section anchor="intent-charge"><name>Intent: "charge"</name>

<t>A one-time payment of the specified amount. The server processes the
payment immediately upon receiving the SPT.</t>

<t><strong>Fulfillment mechanism:</strong></t>

<t><list style="numbers" type="1">
  <t><strong>Shared Payment Token (SPT)</strong>: The payer creates an SPT using the
Stripe API, which the server uses to create a PaymentIntent via Stripe.</t>
</list></t>

</section>
<section anchor="request-schema"><name>Request Schema</name>

<t>The <spanx style="verb">request</spanx> parameter in the <spanx style="verb">WWW-Authenticate</spanx> challenge contains a
base64url-encoded JSON object with the following fields. The JSON <bcp14>MUST</bcp14>
be serialized using JSON Canonicalization Scheme (JCS) <xref target="RFC8785"/> before
base64url encoding, per <xref target="I-D.httpauth-payment"/>.</t>

<section anchor="shared-fields"><name>Shared Fields</name>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">amount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Amount in smallest currency unit (e.g., cents), encoded as a string</c>
      <c><spanx style="verb">currency</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Three-letter ISO currency code (e.g., <spanx style="verb">"usd"</spanx>)</c>
      <c><spanx style="verb">description</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Human-readable payment description</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Merchant's identifier (e.g., order ID, cart ID)</c>
      <c><spanx style="verb">recipient</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Payment recipient identifier</c>
</texttable>

</section>
<section anchor="method-details"><name>Method Details</name>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">methodDetails.networkId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Stripe Business Network Profile ID</c>
      <c><spanx style="verb">methodDetails.paymentMethodTypes</spanx></c>
      <c>[]string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>The list of payment method types that the seller can process.</c>
      <c><spanx style="verb">methodDetails.metadata</spanx></c>
      <c>object</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Key-value pairs for additional context</c>
</texttable>

<t><strong>Example:</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "5000",
  "currency": "usd",
  "description": "Premium API access for 1 month",
  "externalId": "order_12345",
  "methodDetails": {
    "networkId": "profile_1MqDcVKA5fEO2tZvKQm9g8Yj",
    "paymentMethodTypes": ["card", "link"]
  }
}
]]></sourcecode></figure>

<t>The client fulfills this by creating an SPT using Stripe:</t>

<figure><sourcecode type="javascript"><![CDATA[
const spt = await stripe.sharedPayment.issuedTokens.create({
  payment_method: 'pm_123',
  usage_limits: {
    currency: 'usd',
    max_amount: 5000,
    expires_at: Timestamp
  },
  seller_details: {
    networkId: 'profile_123'
  }
});
// Returns: { id: 'spt_1N...' }
]]></sourcecode></figure>

</section>
</section>
<section anchor="credential-schema"><name>Credential Schema</name>

<t>The Payment credential is a base64url-encoded JSON object containing
<spanx style="verb">challenge</spanx> and <spanx style="verb">payload</spanx> fields per
<xref target="I-D.httpauth-payment"/>. For Stripe charge, the <spanx style="verb">payload</spanx> object
contains the following fields:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">spt</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Shared Payment Token ID (starts with <spanx style="verb">spt_</spanx>)</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Client's reference ID</c>
</texttable>

<t><strong>Example:</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "spt": "spt_1N4Zv32eZvKYlo2CPhVPkJlW",
  "externalId": "client_order_789"
}
]]></sourcecode></figure>

</section>
<section anchor="charge-verification"><name>Verification Procedure</name>

<t>Servers <bcp14>MUST</bcp14> verify Payment credentials for charge intent:</t>

<t><list style="numbers" type="1">
  <t>Verify the challenge ID matches the one issued</t>
  <t>Verify the challenge has not expired</t>
  <t>Extract the <spanx style="verb">spt</spanx> from the credential payload</t>
  <t>Verify the SPT has not been previously used (replay protection)</t>
  <t>Validate the SPT exists and is valid via Stripe API (optional pre-check)</t>
</list></t>

<t>Servers <bcp14>MUST</bcp14> complete challenge ID validation and expiry checks (steps 1-2)
before processing credential material (steps 3-5). This ensures basic
request validity is established before accessing payment tokens.</t>

<section anchor="challenge-binding"><name>Challenge Binding</name>

<t>Servers <bcp14>MUST</bcp14> verify that the credential corresponds to the exact challenge
issued. This includes validating:</t>

<t><list style="symbols">
  <t>Challenge ID</t>
  <t>Amount (if specified in request)</t>
  <t>Currency</t>
  <t>Business Network (if specified)</t>
  <t>Any custom metadata</t>
</list></t>

</section>
</section>
<section anchor="charge-settlement"><name>Settlement Procedure</name>

<t><strong>Synchronous settlement:</strong></t>

<t><list style="numbers" type="1">
  <t>Server receives and verifies the credential (<xref target="charge-verification"/>)</t>
  <t>Server creates a Stripe PaymentIntent with <spanx style="verb">confirm: true</spanx> and the
SPT as <spanx style="verb">shared_payment_granted_token</spanx>:</t>
</list></t>

<figure><sourcecode type="javascript"><![CDATA[
const paymentIntent = await stripe.paymentIntents.create({
  amount: Number(request.amount),
  currency: request.currency,
  shared_payment_granted_token: credential.spt,
  confirm: true,
  automatic_payment_methods: {
    enabled: true,
    allow_redirects: 'never'
  },
  metadata: { challenge_id: challenge.id }
}, {
  idempotencyKey: `${challenge.id}_${credential.spt}`
});
]]></sourcecode></figure>

<t><list style="numbers" type="1">
  <t>Server <bcp14>MUST</bcp14> verify the PaymentIntent <spanx style="verb">status</spanx> is <spanx style="verb">"succeeded"</spanx>
before returning 200 with <spanx style="verb">Payment-Receipt</spanx> header</t>
  <t>If the PaymentIntent fails or requires additional action, server
returns 402 with a new challenge</t>
</list></t>

<t><strong>Idempotency:</strong></t>

<t>Servers <bcp14>SHOULD</bcp14> include an idempotency key derived from the challenge ID
and SPT when creating PaymentIntents. This prevents duplicate charges
if the client retries a request.</t>

<t><strong>Settlement timing:</strong></t>

<t>Stripe processes fund transfers asynchronously. Servers <bcp14>SHOULD</bcp14> return
200 immediately after PaymentIntent confirmation (status <spanx style="verb">"succeeded"</spanx>),
even if final fund settlement to the merchant is pending.</t>

<section anchor="receipt-generation"><name>Receipt Generation</name>

<t>Upon successful settlement, servers <bcp14>MUST</bcp14> return a <spanx style="verb">Payment-Receipt</spanx> header
per <xref target="I-D.httpauth-payment"/>. Servers <bcp14>MUST NOT</bcp14> include a
<spanx style="verb">Payment-Receipt</spanx> header on error responses; failures are communicated via
HTTP status codes and Problem Details.</t>

<t>The receipt payload for Stripe charge:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">method</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"stripe"</spanx></c>
      <c><spanx style="verb">reference</spanx></c>
      <c>string</c>
      <c>Stripe PaymentIntent ID (e.g., <spanx style="verb">"pi_1N4..."</spanx>)</c>
      <c><spanx style="verb">status</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"success"</spanx></c>
      <c><spanx style="verb">timestamp</spanx></c>
      <c>string</c>
      <c><xref target="RFC3339"/> confirmation time</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14>. Echoed from credential payload</c>
</texttable>

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

<section anchor="spt-single-use-constraint"><name>SPT Single-Use Constraint</name>

<t>SPTs are single-use tokens. Stripe automatically prevents SPT reuse at
the API level, and idempotency keys (<xref target="charge-settlement"/>) prevent
duplicate PaymentIntent creation. Servers <bcp14>MUST</bcp14> enforce single-use
challenge IDs per <xref target="I-D.httpauth-payment"/> and <bcp14>SHOULD</bcp14>
use Stripe idempotency keys to prevent repeated charges. Servers <bcp14>MAY</bcp14>
additionally maintain a local replay cache of consumed challenge IDs.</t>

</section>
<section anchor="amount-verification"><name>Amount Verification</name>

<t>Clients <bcp14>MUST</bcp14> verify the payment amount in the challenge matches their
expectation before creating an SPT. The SPT usage limits constrain the
currency, maximum amount, and expiration window granted to the seller,
but those limits are derived from the challenge parameters the client
accepts.</t>

<t><strong>Verification checklist:</strong></t>

<t><list style="numbers" type="1">
  <t>Verify the <spanx style="verb">amount</spanx> matches the expected cost</t>
  <t>Verify the <spanx style="verb">currency</spanx> matches the expected currency</t>
  <t>Verify the <spanx style="verb">description</spanx> matches the expected service</t>
  <t>Verify the challenge hasn't expired</t>
  <t>Verify the server's identity (TLS certificate validation)</t>
</list></t>

</section>
<section anchor="pci-dss-compliance"><name>PCI DSS Compliance</name>

<t>Stripe's SPT model ensures clients never handle raw payment method details,
significantly reducing PCI DSS compliance scope.</t>

</section>
<section anchor="https-requirement"><name>HTTPS Requirement</name>

<t>All communication <bcp14>MUST</bcp14> use TLS 1.2 or higher. Shared Payment Tokens <bcp14>MUST</bcp14>
only be transmitted over HTTPS connections.</t>

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

<section anchor="payment-intent-registration"><name>Payment Intent Registration</name>

<t>This specification registers the "charge" intent for the "stripe" payment
method in the Payment Intent Registry established by
<xref target="I-D.httpauth-payment"/>:</t>

<t><list style="symbols">
  <t><strong>Intent</strong>: charge</t>
  <t><strong>Method</strong>: stripe</t>
  <t><strong>Specification</strong>: [this document]</t>
</list></t>

<t>Contact: Stripe (<eref target="mailto:stevekaliski@stripe.com">stevekaliski@stripe.com</eref>) and Tempo Labs (<eref target="mailto:brendan@tempo.xyz">brendan@tempo.xyz</eref>)</t>

</section>
</section>


  </middle>

  <back>


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

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

&RFC2119;
&RFC3339;
&RFC8174;
&RFC8785;
&RFC7235;
<reference anchor="I-D.httpauth-payment" target="https://datatracker.ietf.org/doc/draft-ryan-httpauth-payment/">
  <front>
    <title>The 'Payment' HTTP Authentication Scheme</title>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <date year="2026" month="January"/>
  </front>
</reference>


    </references>

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

<reference anchor="STRIPE-API" target="https://stripe.com/docs/api">
  <front>
    <title>Stripe API Reference</title>
    <author >
      <organization>Stripe, Inc.</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="STRIPE-SPT" target="https://docs.stripe.com/agentic-commerce/concepts/shared-payment-tokens">
  <front>
    <title>Shared payment tokens</title>
    <author >
      <organization>Stripe, Inc.</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>


<?line 389?>

<section anchor="abnf-collected"><name>ABNF Collected</name>

<figure><sourcecode type="abnf"><![CDATA[
stripe-charge-challenge = "Payment" 1*SP
  "id=" quoted-string ","
  "realm=" quoted-string ","
  "method=" DQUOTE "stripe" DQUOTE ","
  "intent=" DQUOTE "charge" DQUOTE ","
  "request=" base64url-nopad

stripe-charge-credential = "Payment" 1*SP base64url-nopad

; Base64url encoding without padding per RFC 4648 Section 5
base64url-nopad = 1*( ALPHA / DIGIT / "-" / "_" )
]]></sourcecode></figure>

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

<section anchor="charge-example-http-transport"><name>Charge Example (HTTP Transport)</name>

<t><strong>Step 1: Client requests resource</strong></t>

<figure><sourcecode type="http"><![CDATA[
GET /api/generate HTTP/1.1
Host: api.example.com
]]></sourcecode></figure>

<t><strong>Step 2: Server issues payment challenge</strong></t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 402 Payment Required
WWW-Authenticate: Payment id="ch_1a2b3c4d5e",
  realm="api.example.com",
  method="stripe",
  intent="charge",
  request="eyJhbW91bnQiOiI1MDAwIiwiY3VycmVuY3kiOiJ1c2QiLCJkZXNjcmlwdGlvbiI6IkFJIGdlbmVyYXRpb24ifQ"
Cache-Control: no-store
Content-Type: application/json

{
  "type": "https://paymentauth.org/problems/payment-required",
  "title": "Payment Required",
  "status": 402,
  "detail": "This resource requires payment"
}
]]></sourcecode></figure>

<t>Decoded request:
~~~ json
{
  "amount": "5000",
  "currency": "usd",
  "description": "AI generation"
}
~~~</t>

<t><strong>Step 3: Client creates SPT and submits credential</strong></t>

<figure><sourcecode type="http"><![CDATA[
GET /api/generate HTTP/1.1
Host: api.example.com
Authorization: Payment eyJjaGFsbGVuZ2UiOnsiaWQiOiJjaF8xYTJiM2M0ZDVlIiwicmVhbG0iOiJhcGkuZXhhbXBsZS5jb20iLCJtZXRob2QiOiJzdHJpcGUiLCJpbnRlbnQiOiJjaGFyZ2UiLCJyZXF1ZXN0IjoiZXlKaGJXOTFiblFpT2lJMU1EQXdJaXdpWTNWeWNtVnVZM2tpT2lKMWMyUWlMQ0prWlhOamNtbHdkR2x2YmlJNklrRkpJR2RsYm1WeVlYUnBiMjRpZlEiLCJleHBpcmVzIjoiMjAyNS0wMS0xNVQxMjowNTowMFoifSwicGF5bG9hZCI6eyJzcHQiOiJzcHRfMU40WnYzMmVadktZbG8yQ1BoVlBrSmxXIn19

]]></sourcecode></figure>

<t>Decoded credential:
~~~ json
{
  "challenge": {
    "id": "ch_1a2b3c4d5e",
    "realm": "api.example.com",
    "method": "stripe",
    "intent": "charge",
    "request": "eyJhbW91bnQiOiI1MDAwIiwiY3VycmVuY3kiOiJ1c2QiLCJkZXNjcmlwdGlvbiI6IkFJIGdlbmVyYXRpb24ifQ",
    "expires": "2025-01-15T12:05:00Z"
  },
  "payload": {
    "spt": "spt_1N4Zv32eZvKYlo2CPhVPkJlW"
  }
}
~~~</t>

<t><strong>Step 4: Server processes payment and returns resource</strong></t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Payment-Receipt: eyJtZXRob2QiOiJzdHJpcGUiLCJyZWZlcmVuY2UiOiJwaV8xTjRadjMyZVp2S1lsbzJDUGhWUGtKbFciLCJzdGF0dXMiOiJzdWNjZXNzIiwidGltZXN0YW1wIjoiMjAyNS0wMS0xNVQxMjowNDozMloifQ
Cache-Control: private
Content-Type: text/plain

Here is your generated content...
]]></sourcecode></figure>

<t>Decoded receipt:
~~~ json
{
  "method": "stripe",
  "reference": "pi_1N4Zv32eZvKYlo2CPhVPkJlW",
  "status": "success",
  "timestamp": "2025-01-15T12:04:32Z"
}
~~~</t>

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

<t>The authors thank the Tempo community for their feedback on this
specification.</t>

</section>


  </back>

<!-- ##markdown-source:
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
0qm1COmIcxszS+qr88ikkKHXyP8A24P0mjQ+AAA=

-->

</rfc>

