<?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.39 (Ruby 4.0.6) -->


<!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 RFC4648 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8259 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
<!ENTITY RFC8785 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
]>


<rfc ipr="noModificationTrust200902" docName="draft-tempo-subscription-00" category="info" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="Tempo Subscription">Tempo Subscription Intent for HTTP Payment Authentication</title>

    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization>Tempo Labs</organization>
      <address>
        <email>jake@tempo.xyz</email>
      </address>
    </author>
    <author initials="B." surname="Ryan" fullname="Brendan Ryan">
      <organization>Tempo Labs</organization>
      <address>
        <email>brendan@tempo.xyz</email>
      </address>
    </author>
    <author initials="T." surname="Meagher" fullname="Tom Meagher">
      <organization>Tempo Labs</organization>
      <address>
        <email>thomas@tempo.xyz</email>
      </address>
    </author>

    <date year="2026" month="July" day="29"/>

    
    
    

    <abstract>


<?line 61?>

<t>This document defines the "subscription" intent for the "tempo"
payment method in the Payment HTTP Authentication Scheme. It specifies
how clients grant servers permission to collect a fixed TIP-20 token
payment once per billing period using recipient-scoped access keys on
the Tempo blockchain. This profile intentionally models the recurring
transfer authorization itself, not a richer billing object.</t>



    </abstract>



  </front>

  <middle>


<?line 70?>

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

<t>The <spanx style="verb">subscription</spanx> intent on Tempo represents a recurring fixed-amount
TIP-20 payment. The client grants the server a recipient-scoped access
key with a per-period spending limit. Activation registers the key and
collects the first billing-period charge in the same transaction.</t>

<t>This specification inherits the shared <spanx style="verb">subscription</spanx> intent semantics
from <xref target="I-D.payment-intent-subscription"/> and defines Tempo-specific
request fields, payloads, and settlement behavior.</t>

<t>This profile is intentionally narrower than a general billing
subscription. It standardizes a recurring token-transfer authorization,
not price catalogs, quantities, prorations, deferred starts, or
billing-anchor resets.</t>

<t>Tempo subscriptions support only key-authorization fulfillment.
Tempo transactions containing standalone <spanx style="verb">approve</spanx> calls and push-mode
hash credentials do not provide the per-period enforcement required for
this intent.</t>

<t>Tempo also imposes an additional constraint that is not part of the
shared intent: the recurring authorization <bcp14>MUST</bcp14> have an explicit expiry.
This method therefore requires a <spanx style="verb">subscriptionExpires</spanx> field because the
underlying Tempo key authorization itself is time-bounded.</t>

<t>Tempo subscriptions also require the <xref target="TIP-1011"/> periodic token-limit
and <spanx style="verb">allowed_calls</spanx> restrictions described in this document. Servers
<bcp14>MUST</bcp14> reject request objects on chains or deployments that cannot enforce
those restrictions.</t>

<t>The <xref target="TIP-1011"/> features required by this specification — periodic
spending limits, <spanx style="verb">allowed_calls</spanx> target and selector scoping, and
recipient-bound selector rules — are introduced in the Tempo T3 network
upgrade. Servers <bcp14>MUST NOT</bcp14> issue <spanx style="verb">intent="subscription"</spanx> challenges on
chains or deployments running a pre-T3 protocol version.</t>

<section anchor="subscription-flow"><name>Subscription Flow</name>

<t>The following diagram illustrates the Tempo subscription flow:</t>

<figure><artwork><![CDATA[
   Client                        Server                           Tempo
      │                             │                             │
      │  (1) GET /api/resource      │                             │
      │-------------------------->  │                             │
      │                             │                             │
      │  (2) 402 Payment Required   │                             │
      │      intent="subscription"  │                             │
      │<--------------------------  │                             │
      │                             │                             │
      │  (3) Sign keyAuthorization  │                             │
      │      with period limit      │                             │
      │                             │                             │
      │  (4) Authorization: Payment │                             │
      │-------------------------->  │                             │
      │                             │                             │
      │                             │  (5) Register key +         │
      │                             │      transfer first period  │
      │                             │-------------------------->  │
      │                             │                             │
      │  (6) 200 OK + Receipt       │                             │
      │<--------------------------  │                             │
      │                             │                             │
      │        ... later period ... │                             │
      │                             │                             │
      │                             │  (7) transfer next period   │
      │                             │-------------------------->  │
      │                             │                             │
      │  (8) 200 OK + Receipt       │                             │
      │<--------------------------  │                             │
      │                             │                             │
]]></artwork></figure>

</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>TIP-20</dt>
  <dd>
    <t>Tempo's enshrined token standard, implemented as precompiles rather
than smart contracts. TIP-20 tokens use 6 decimal places and provide
<spanx style="verb">transfer</spanx>, <spanx style="verb">transferFrom</spanx>, and <spanx style="verb">approve</spanx> operations.</t>
  </dd>
  <dt>Access Key</dt>
  <dd>
    <t>A delegated signing key. For Tempo subscriptions, the access key is
configured with an expiry timestamp, a per-period token spending
limit, and a destination restriction.</t>
  </dd>
  <dt>AccountKeychain Precompile</dt>
  <dd>
    <t>The Tempo precompile that manages access-key registration, spending
limits, and periodic-limit enforcement <xref target="TEMPO-ACCOUNT-KEYCHAIN"/>.</t>
  </dd>
</dl>

</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. The <spanx style="verb">request</spanx> JSON <bcp14>MUST</bcp14> be serialized
using JSON Canonicalization Scheme (JCS) <xref target="RFC8785"/> and
base64url-encoded without padding per <xref target="I-D.httpauth-payment"/>.</t>

<section anchor="request-fields"><name>Request Fields</name>

<t>Tempo uses the shared <spanx style="verb">amount</spanx>, <spanx style="verb">currency</spanx>, <spanx style="verb">periodUnit</spanx>, <spanx style="verb">periodCount</spanx>,
<spanx style="verb">subscriptionExpires</spanx>, <spanx style="verb">recipient</spanx>, <spanx style="verb">description</spanx>, and <spanx style="verb">externalId</spanx>
fields from <xref target="I-D.payment-intent-subscription"/>. Tempo additionally
requires <spanx style="verb">subscriptionExpires</spanx> because Tempo key authorizations must
expire:</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">amount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Fixed payment amount per billing period in base units</c>
      <c><spanx style="verb">currency</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>TIP-20 token address</c>
      <c><spanx style="verb">periodUnit</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Billing period unit. The value <bcp14>MUST</bcp14> be <spanx style="verb">day</spanx> or <spanx style="verb">week</spanx></c>
      <c><spanx style="verb">periodCount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Positive integer count of <spanx style="verb">periodUnit</spanx> values per billing period</c>
      <c><spanx style="verb">subscriptionExpires</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Subscription expiry timestamp in <xref target="RFC3339"/> format</c>
      <c><spanx style="verb">recipient</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Recipient address authorized for subscription charges</c>
      <c><spanx style="verb">description</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Human-readable subscription description</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Merchant's reference for the subscription</c>
</texttable>

<t>The <spanx style="verb">amount</spanx> value <bcp14>MUST</bcp14> be a string representation of a positive
integer in base 10 with no sign, decimal point, exponent, or
surrounding whitespace. Leading zeros <bcp14>MUST NOT</bcp14> be used.</t>

<t>The <spanx style="verb">periodCount</spanx> value <bcp14>MUST</bcp14> be a string representation of a positive
integer in base 10 with no sign, decimal point, exponent, or
surrounding whitespace. Leading zeros <bcp14>MUST NOT</bcp14> be used.</t>

<t>Hex values in this profile use lowercase hexadecimal with <spanx style="verb">0x</spanx> prefix
and no padding or truncation. Implementations <bcp14>MUST</bcp14> use lowercase hex
when generating addresses, token identifiers, selectors, and
hex-encoded signed payloads. Implementations <bcp14>SHOULD</bcp14> accept mixed-case
input, but <bcp14>MUST</bcp14> normalize it to lowercase before comparison. Address,
selector, and token-identifier comparisons are by decoded value, not
raw string form.</t>

</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.accessKey</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Access key descriptor that the payer authorizes for subscription renewal charges</c>
      <c><spanx style="verb">methodDetails.accessKey.accessKeyAddress</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Address of the access key to authorize</c>
      <c><spanx style="verb">methodDetails.accessKey.keyType</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Access key type. The value <bcp14>MUST</bcp14> be <spanx style="verb">p256</spanx>, <spanx style="verb">secp256k1</spanx>, or <spanx style="verb">webAuthn</spanx></c>
      <c><spanx style="verb">methodDetails.chainId</spanx></c>
      <c>number</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Tempo chain ID. If omitted, the default value is 42431 (Tempo mainnet).</c>
</texttable>

<t>Servers issuing <spanx style="verb">intent="subscription"</spanx> challenges <bcp14>SHOULD</bcp14> include the
<spanx style="verb">expires</spanx> auth-param in <spanx style="verb">WWW-Authenticate</spanx> per <xref target="I-D.httpauth-payment"/>,
using <xref target="RFC3339"/> format. Request objects <bcp14>MUST NOT</bcp14> duplicate the
challenge expiry value. The <spanx style="verb">subscriptionExpires</spanx> field instead defines
when the subscription itself expires.</t>

<t>If the challenge includes <spanx style="verb">expires</spanx>, the <spanx style="verb">subscriptionExpires</spanx> value
<bcp14>MUST</bcp14> be strictly later than the challenge <spanx style="verb">expires</spanx> timestamp. Servers
<bcp14>MUST</bcp14> reject credentials where <spanx style="verb">subscriptionExpires</spanx> is at or before the
challenge <spanx style="verb">expires</spanx>.</t>

<t>Tempo subscriptions map the shared period fields to the <xref target="TIP-1011"/>
<spanx style="verb">TokenLimit</spanx> <spanx style="verb">period</spanx> field as follows:</t>

<t><list style="symbols">
  <t><spanx style="verb">periodUnit="day"</spanx> maps to <spanx style="verb">periodCount * 86400</spanx> seconds</t>
  <t><spanx style="verb">periodUnit="week"</spanx> maps to <spanx style="verb">periodCount * 604800</spanx> seconds</t>
</list></t>

<t>Servers <bcp14>MUST</bcp14> reject <spanx style="verb">periodUnit="month"</spanx> because <xref target="TIP-1011"/> periodic
token limits are fixed elapsed-time periods and cannot represent
calendar-month billing exactly. Servers <bcp14>MUST</bcp14> reject request objects
where the mapped period cannot be represented as an unsigned 64-bit
integer. Servers <bcp14>MUST</bcp14> reject request objects where <spanx style="verb">subscriptionExpires</spanx>
cannot be represented in the Tempo key authorization expiry field.</t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "0x20c0000000000000000000000000000000000001",
  "periodUnit": "day",
  "periodCount": "30",
  "subscriptionExpires": "2026-07-14T12:00:00Z",
  "recipient": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
  "methodDetails": {
    "accessKey": {
      "accessKeyAddress": "0x1111111111111111111111111111111111111111",
      "keyType": "p256"
    },
    "chainId": 42431
  }
}
]]></sourcecode></figure>

<t>The client fulfills this by signing a key authorization with:</t>

<t><list style="symbols">
  <t>Expiry = <spanx style="verb">subscriptionExpires</spanx></t>
  <t>Access key = <spanx style="verb">methodDetails.accessKey</spanx></t>
  <t>Per-period spending limit = <spanx style="verb">amount</spanx></t>
  <t>Billing period = mapped period in seconds</t>
  <t>Destination restriction = <spanx style="verb">recipient</spanx></t>
</list></t>

<t>The signed key authorization <bcp14>MUST</bcp14> additionally configure:</t>

<t><list style="symbols">
  <t>the exact access-key address and key type from
<spanx style="verb">methodDetails.accessKey</spanx></t>
  <t>a <spanx style="verb">TokenLimit</spanx> for <spanx style="verb">currency</spanx> whose <spanx style="verb">amount</spanx> equals the challenge
<spanx style="verb">amount</spanx> and whose <spanx style="verb">period</spanx> equals the mapped period in seconds</t>
  <t>exactly one <spanx style="verb">allowed_calls</spanx> target scope whose <spanx style="verb">target</spanx> equals
<spanx style="verb">currency</spanx></t>
  <t>explicit selector rules for <spanx style="verb">transfer(address,uint256)</spanx>
(<spanx style="verb">0xa9059cbb</spanx>) and optionally
<spanx style="verb">transferWithMemo(address,uint256,bytes32)</spanx> (<spanx style="verb">0x95777d59</spanx>)</t>
  <t>a recipient allowlist for each permitted selector containing only the
challenge <spanx style="verb">recipient</spanx></t>
</list></t>

<t>The signed key authorization <bcp14>MUST NOT</bcp14> use unrestricted target mode for
the subscription token, and it <bcp14>MUST NOT</bcp14> authorize <spanx style="verb">approve</spanx> or any
other non-transfer selector.</t>

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

<t>The credential in the <spanx style="verb">Authorization</spanx> header contains a
base64url-encoded JSON object per <xref target="I-D.httpauth-payment"/>.</t>

<section anchor="credential-structure"><name>Credential Structure</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">challenge</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Echo of the challenge from the server</c>
      <c><spanx style="verb">payload</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Tempo-specific payload object</c>
      <c><spanx style="verb">source</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Payer identifier as a DID (e.g., <spanx style="verb">did:pkh:eip155:42431:0x...</spanx>)</c>
</texttable>

<t>The <spanx style="verb">source</spanx> field, if present, <bcp14>SHOULD</bcp14> use the <spanx style="verb">did:pkh</spanx> method with
the chain ID applicable to the challenge and the payer's Ethereum
address.</t>

</section>
<section anchor="key-authorization-payload-typekeyauthorization"><name>Key Authorization Payload (type="keyAuthorization")</name>

<t>Subscriptions on Tempo <bcp14>MUST</bcp14> use <spanx style="verb">type="keyAuthorization"</spanx>. The
<spanx style="verb">signature</spanx> field contains the complete signed key authorization
serialized as RLP and hex-encoded with <spanx style="verb">0x</spanx> prefix.</t>

<t>The encoded value <bcp14>MUST</bcp14> be a signed key authorization containing at
least:</t>

<t><list style="symbols">
  <t>the Tempo chain ID</t>
  <t>the access-key address and key type</t>
  <t>the authorization expiry</t>
  <t>the TIP-20 token spending limit</t>
  <t>the billing-period limit configuration</t>
  <t>the recipient restriction</t>
  <t>the <spanx style="verb">allowed_calls</spanx> scope described above</t>
</list></t>

<t>The embedded signature <bcp14>MUST</bcp14> use a primitive signature type supported by
<xref target="TIP-1020"/>. Keychain wrapper signatures <bcp14>MUST NOT</bcp14> be used for this
field.</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">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Hex-encoded RLP-serialized signed key authorization</c>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"keyAuthorization"</spanx></c>
</texttable>

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

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "qT8wErYuI3oPlKjH6gFdSa",
    "realm": "api.example.com",
    "method": "tempo",
    "intent": "subscription",
    "request": "eyJ...",
    "expires": "2026-01-15T12:05:00Z"
  },
  "payload": {
    "signature": "0xf8c1...signed authorization bytes...",
    "type": "keyAuthorization"
  },
  "source": "did:pkh:eip155:42431:0x1234567890abcdef1234567890abcdef12345678"
}
]]></sourcecode></figure>

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

<section anchor="activation-and-first-period-charge"><name>Activation and First-Period Charge</name>

<t>For <spanx style="verb">intent="subscription"</spanx>, activation and the first billing-period
charge are a single atomic operation:</t>

<figure><artwork><![CDATA[
   Client                        Server                           Tempo
      |                             |                             |
      |  (1) Authorization:         |                             |
      |      Payment <credential>   |                             |
      |      (signed keyAuth)       |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |                             |  (2) Construct tx with:     |
      |                             |      - keyAuthorization     |
      |                             |      - transfer(recipient,  |
      |                             |        amount)              |
      |                             |                             |
      |                             |  (3) eth_sendRawTxSync      |
      |                             |-------------------------->  |
      |                             |                             |
      |                             |  (4) Key registered +       |
      |                             |      transfer executed      |
      |                             |<--------------------------  |
      |                             |                             |
      |  (5) 200 OK                 |                             |
      |      Payment-Receipt: ...   |                             |
      |<--------------------------  |                             |
      |                             |                             |
]]></artwork></figure>

<t>Servers <bcp14>MUST</bcp14> treat the subscription as active only after the activation
transaction succeeds.</t>

<t>Servers <bcp14>MUST NOT</bcp14> treat activation as successful if the activation
transaction settles at or after <spanx style="verb">subscriptionExpires</spanx>.</t>

</section>
<section anchor="renewal"><name>Renewal</name>

<t>For each later billing period, the server <bcp14>MAY</bcp14> submit one transaction
using the registered access key to transfer <spanx style="verb">amount</spanx> to <spanx style="verb">recipient</spanx>.</t>

<t>Servers <bcp14>MUST NOT</bcp14> submit more than one successful renewal charge for the
same billing period.</t>

</section>
<section anchor="billing-anchor-and-subscription-state"><name>Billing Anchor and Subscription State</name>

<t>The billing anchor for a Tempo subscription is the block timestamp, or
equivalent consensus settlement timestamp, of the block containing the
successful activation transaction. Servers <bcp14>MUST</bcp14> derive this anchor from
chain settlement data rather than local wall-clock time.</t>

<t>Billing periods are defined as:</t>

<t><list style="symbols">
  <t>Period 0: <spanx style="verb">[anchor, anchor + mappedPeriodSeconds)</spanx></t>
  <t>Period 1: <spanx style="verb">[anchor + mappedPeriodSeconds, anchor + 2*mappedPeriodSeconds)</spanx></t>
  <t>Period N: <spanx style="verb">[anchor + N*mappedPeriodSeconds, anchor + (N+1)*mappedPeriodSeconds)</spanx></t>
</list></t>

<t>Servers <bcp14>MUST</bcp14> maintain durable local state for each subscription,
including at least:</t>

<t><list style="symbols">
  <t>subscription identifier</t>
  <t>billing anchor</t>
  <t>last charged billing-period index</t>
  <t>any in-flight billing-period index and renewal transaction identifier</t>
  <t>subscription expiry</t>
  <t>revocation status</t>
</list></t>

<t>When granting access in a later billing period, servers <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>Verify the subscription has not expired or been revoked</t>
  <t>Determine the current billing-period index from the anchor and
the mapped period in seconds</t>
  <t>Verify that the current billing period has not already been charged</t>
  <t>Atomically record any renewal attempt for the current billing period
as in-flight before submitting the renewal transaction</t>
  <t>Mark the current billing period as charged only after the renewal
transaction settles successfully</t>
  <t>Grant access only after, or atomically with, durably recording the
successful renewal charge</t>
</list></t>

<t>For duplicate idempotent requests, servers <bcp14>MUST NOT</bcp14> charge the same
billing period more than once.</t>

<t><xref target="TIP-1011"/> periodic spending limits reset to one billing period of
capacity and do not accumulate across elapsed periods. If one or more
billing periods elapse without a successful renewal charge, a later
transaction authorizes at most one charge in the then-current billing
period. Servers <bcp14>MUST NOT</bcp14> treat missed billing periods as additional
on-chain spending capacity.</t>

</section>
<section anchor="source-verification"><name>Source Verification</name>

<t>If a credential includes the optional <spanx style="verb">source</spanx> field, servers <bcp14>MUST NOT</bcp14>
trust this value without verification.</t>

<t>Servers <bcp14>MUST</bcp14> verify the payer identity by recovering the root signer
address from the signed key authorization using
<xref target="TIP-1020"/>-compatible verification semantics over the encoded key
authorization payload.</t>

<t>If <spanx style="verb">source</spanx> is present, servers <bcp14>MUST</bcp14> verify that it identifies the
recovered root signer on the same chain as <spanx style="verb">methodDetails.chainId</spanx>, or
on chain 42431 when <spanx style="verb">methodDetails.chainId</spanx> is omitted.</t>

</section>
<section anchor="authorization-scope-verification"><name>Authorization Scope Verification</name>

<t>When validating a Tempo subscription credential, servers <bcp14>MUST</bcp14> verify
that the signed key authorization expiry equals <spanx style="verb">subscriptionExpires</spanx>.
Servers <bcp14>MUST</bcp14> verify that the signed key authorization chain ID equals
<spanx style="verb">methodDetails.chainId</spanx>, or 42431 when <spanx style="verb">methodDetails.chainId</spanx> is
omitted. Servers <bcp14>MUST</bcp14> verify that the signed key authorization
authorizes the exact access key described by
<spanx style="verb">methodDetails.accessKey</spanx>, including both <spanx style="verb">accessKeyAddress</spanx> and
<spanx style="verb">keyType</spanx>.
Servers <bcp14>MUST</bcp14> also verify that the authorization contains a spending
limit for <spanx style="verb">currency</spanx> whose amount equals <spanx style="verb">amount</spanx> and whose billing
period equals the mapped period in seconds.</t>

<t>Servers <bcp14>MUST</bcp14> verify that the signed key authorization's <spanx style="verb">allowed_calls</spanx>
scope:</t>

<t><list style="symbols">
  <t>contains exactly one target scope, and that scope is for <spanx style="verb">currency</spanx></t>
  <t>uses explicit selector rules rather than unrestricted target mode</t>
  <t>allows <spanx style="verb">transfer(address,uint256)</spanx> and <bcp14>MAY</bcp14> additionally allow
<spanx style="verb">transferWithMemo(address,uint256,bytes32)</spanx></t>
  <t>does not allow <spanx style="verb">approve(address,uint256)</spanx> or any other non-transfer
selector</t>
  <t>restricts the first ABI <spanx style="verb">address</spanx> argument for each permitted
selector to the challenge <spanx style="verb">recipient</spanx></t>
</list></t>

<t>Servers <bcp14>MUST</bcp14> reject authorizations that permit spending the subscription
token through broader call scopes than those required above.</t>

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

<t>Upon successful activation or renewal, 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.</t>

<t>On activation, servers <bcp14>MUST</bcp14> include the <spanx style="verb">subscriptionId</spanx> defined by
<xref target="I-D.payment-intent-subscription"/> in the receipt. On renewal, servers
<bcp14>MUST</bcp14> return the same <spanx style="verb">subscriptionId</spanx> for the active subscription.</t>

<t>The receipt payload for Tempo subscription:</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">"tempo"</spanx></c>
      <c><spanx style="verb">reference</spanx></c>
      <c>string</c>
      <c>Transaction hash of the settlement transaction</c>
      <c><spanx style="verb">status</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"success"</spanx></c>
      <c><spanx style="verb">subscriptionId</spanx></c>
      <c>string</c>
      <c>Server-issued opaque identifier for the subscription</c>
      <c><spanx style="verb">timestamp</spanx></c>
      <c>string</c>
      <c><xref target="RFC3339"/> settlement time</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14>. Echoed from the challenge request</c>
</texttable>

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

<section anchor="destination-scoping"><name>Destination Scoping</name>

<t>Tempo subscription access keys <bcp14>MUST</bcp14> be restricted to the <spanx style="verb">recipient</spanx>
address in the request. Where <xref target="TIP-1011"/> recipient-bound selector
rules are available, servers <bcp14>MUST</bcp14> reject credentials that do not
enforce this restriction through <spanx style="verb">allowed_calls</spanx>.</t>

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

<t>Clients <bcp14>MUST</bcp14> parse and verify the <spanx style="verb">request</spanx> payload before signing:</t>

<t><list style="numbers" type="1">
  <t>Verify <spanx style="verb">amount</spanx> is reasonable for the service</t>
  <t>Verify <spanx style="verb">currency</spanx> is the expected TIP-20 token address</t>
  <t>Verify <spanx style="verb">periodUnit</spanx> and <spanx style="verb">periodCount</spanx> match expectations</t>
  <t>Verify <spanx style="verb">recipient</spanx> is controlled by the expected party</t>
  <t>Verify <spanx style="verb">subscriptionExpires</spanx> is acceptable</t>
</list></t>

</section>
<section anchor="revocation"><name>Revocation</name>

<t>Users can revoke subscription access keys at any time via the
AccountKeychain precompile <xref target="TEMPO-ACCOUNT-KEYCHAIN"/>. Servers <bcp14>SHOULD</bcp14>
handle revocation gracefully by returning a fresh subscription
challenge.</t>

</section>
<section anchor="duplicate-charge-prevention"><name>Duplicate Charge Prevention</name>

<t>On-chain periodic limits prevent overspending within a billing period,
but they do not by themselves make HTTP service delivery idempotent
<xref target="TEMPO-ACCOUNT-KEYCHAIN"/>. Servers <bcp14>MUST</bcp14> implement durable local state
to prevent duplicate renewal charges caused by retries or concurrent
requests.</t>

</section>
<section anchor="key-scope-minimization"><name>Key Scope Minimization</name>

<t>Subscription access keys <bcp14>SHOULD</bcp14> use the narrowest <xref target="TIP-1011"/> scope
needed to support recurring charges. Implementations <bcp14>SHOULD</bcp14> avoid
unrestricted target scopes and <bcp14>SHOULD</bcp14> limit the key to the subscription
token, the permitted transfer selectors, and the configured recipient.</t>

</section>
<section anchor="access-key-isolation"><name>Access Key Isolation</name>

<t>Servers <bcp14>SHOULD</bcp14> generate a unique key pair and use a distinct access key
for each subscription. This provides fault isolation: compromise of one
server-held key affects only the subscription associated with that key,
and revoking one subscription's key via <spanx style="verb">revokeKey()</spanx> does not
invalidate other active subscriptions between the same payer and server.</t>

<t>If a server reuses a single access key across multiple subscriptions
from the same payer, the key's permissions must be broad enough to cover
all active subscriptions — potentially spanning multiple tokens,
recipients, or spending limits. This widens the blast radius if the key
is compromised and forces revocation of all subscriptions at once. It
also complicates spending-limit accounting, since <xref target="TIP-1011"/> enforces
a single <spanx style="verb">TokenLimit</spanx> per <spanx style="verb">(account, key, token)</spanx> tuple: two
subscriptions for the same token on the same key would share one
periodic limit rather than being independently capped.</t>

<t>Servers that reuse keys across subscriptions <bcp14>MUST</bcp14> ensure the combined
<spanx style="verb">TokenLimit</spanx> and <spanx style="verb">allowed_calls</spanx> scope still satisfies the per-
subscription authorization scope verification requirements in this
document. In practice this is difficult to guarantee, and
implementations <bcp14>SHOULD</bcp14> prefer one key per subscription for simplicity
and security.</t>

</section>
<section anchor="caching"><name>Caching</name>

<t>Responses to subscription challenges (402 Payment Required) <bcp14>MUST</bcp14> include
<spanx style="verb">Cache-Control: no-store</spanx> to prevent sensitive payment data from being
cached by intermediaries.</t>

<t>Responses containing <spanx style="verb">Payment-Receipt</spanx> headers <bcp14>MUST</bcp14> include
<spanx style="verb">Cache-Control: private</spanx> to prevent shared caches from storing payment
receipts.</t>

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

<t>The <spanx style="verb">subscription</spanx> payment intent is registered by
<xref target="I-D.payment-intent-subscription"/>. This document does not register it
again.</t>

</section>


  </middle>

  <back>



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

&RFC2119;
&RFC3339;
&RFC4648;
&RFC8174;
&RFC8259;
&RFC8785;
<reference anchor="I-D.httpauth-payment" target="https://datatracker.ietf.org/doc/draft-ietf-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>
<reference anchor="I-D.payment-intent-subscription" target="https://datatracker.ietf.org/doc/draft-payment-intent-subscription/">
  <front>
    <title>Subscription Intent for HTTP Payment Authentication</title>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <date year="2026" month="April"/>
  </front>
</reference>
<reference anchor="TEMPO-ACCOUNT-KEYCHAIN" target="https://docs.tempo.xyz/protocol/precompiles/account-keychain">
  <front>
    <title>Account Keychain Precompile</title>
    <author >
      <organization>Tempo Labs</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="TIP-1011" target="https://docs.tempo.xyz/protocol/tips/tip-1011">
  <front>
    <title>TIP-1011: Enhanced Access Key Permissions</title>
    <author initials="T." surname="Goyal" fullname="Tanishk Goyal">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="TIP-1020" target="https://docs.tempo.xyz/protocol/tips/tip-1020">
  <front>
    <title>TIP-1020: Signature Verification Precompile</title>
    <author >
      <organization>Tempo Labs</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>




<?line 607?>

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

<t>This section is non-normative.</t>

<section anchor="activation"><name>Activation</name>

<t><strong>Challenge:</strong></t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 402 Payment Required
Cache-Control: no-store
WWW-Authenticate: Payment id="qT8wErYuI3oPlKjH6gFdSa",
  realm="api.example.com",
  method="tempo",
  intent="subscription",
  expires="2026-01-15T12:05:00Z",
  request="<base64url-encoded JSON below>"
]]></sourcecode></figure>

<t>The <spanx style="verb">request</spanx> decodes to:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "0x20c0000000000000000000000000000000000001",
  "periodUnit": "day",
  "periodCount": "30",
  "subscriptionExpires": "2026-07-14T12:00:00Z",
  "recipient": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
  "methodDetails": {
    "accessKey": {
      "accessKeyAddress": "0x1111111111111111111111111111111111111111",
      "keyType": "p256"
    },
    "chainId": 42431
  }
}
]]></sourcecode></figure>

<t>This requests a recurring payment of 10.00 alphaUSD every 30 days until
2026-07-14T12:00:00Z.</t>

<t><strong>Credential:</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "qT8wErYuI3oPlKjH6gFdSa",
    "realm": "api.example.com",
    "method": "tempo",
    "intent": "subscription",
    "request": "eyJ...",
    "expires": "2026-01-15T12:05:00Z"
  },
  "payload": {
    "signature": "0xf8c1...signed authorization bytes...",
    "type": "keyAuthorization"
  },
  "source": "did:pkh:eip155:42431:0x1234567890abcdef1234567890abcdef12345678"
}
]]></sourcecode></figure>

<t>The activation transaction submitted by the server contains:</t>

<t><list style="symbols">
  <t>the signed <spanx style="verb">keyAuthorization</spanx></t>
  <t>one TIP-20 <spanx style="verb">transfer(recipient, amount)</spanx> call, or
<spanx style="verb">transferWithMemo(recipient, amount, memo)</spanx> if the implementation uses
a memo</t>
</list></t>

<t>If activation settles at <spanx style="verb">2026-01-15T12:03:10Z</spanx>, the <spanx style="verb">Payment-Receipt</spanx>
payload decodes to:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "tempo",
  "reference": "0x8d7c6c0d94d8488cb4cf6ab7b8a2f9c3f8e0eac7e5b6d1e8c3d86f733c2b7c01",
  "status": "success",
  "subscriptionId": "c3ViXzAxMjM0NTY",
  "timestamp": "2026-01-15T12:03:10Z"
}
]]></sourcecode></figure>

<t>The server records at least:</t>

<t><list style="symbols">
  <t><spanx style="verb">subscriptionId = "c3ViXzAxMjM0NTY"</spanx></t>
  <t><spanx style="verb">billing anchor = 2026-01-15T12:03:10Z</spanx></t>
  <t><spanx style="verb">periodUnit = "day"</spanx></t>
  <t><spanx style="verb">periodCount = "30"</spanx></t>
  <t><spanx style="verb">mappedPeriodSeconds = 2592000</spanx></t>
  <t><spanx style="verb">accessKeyAddress = "0x1111111111111111111111111111111111111111"</spanx></t>
  <t><spanx style="verb">last charged billing-period index = 0</spanx></t>
</list></t>

</section>
<section anchor="renewal-across-multiple-periods"><name>Renewal Across Multiple Periods</name>

<t>Using the activation timestamp above, the Tempo subscription billing
periods are:</t>

<t><list style="symbols">
  <t>Period 0: <spanx style="verb">[2026-01-15T12:03:10Z, 2026-02-14T12:03:10Z)</spanx></t>
  <t>Period 1: <spanx style="verb">[2026-02-14T12:03:10Z, 2026-03-16T12:03:10Z)</spanx></t>
  <t>Period 2: <spanx style="verb">[2026-03-16T12:03:10Z, 2026-04-15T12:03:10Z)</spanx></t>
</list></t>

<t>Requests during Period 0 can use the active subscription without a new
authorization:</t>

<figure><sourcecode type="http"><![CDATA[
GET /api/resource HTTP/1.1
Host: api.example.com
Cookie: session=<application-session>
]]></sourcecode></figure>

<t>When Period 1 begins, the server determines that billing-period index 1
has not yet been charged. The server submits one Tempo transaction using
the registered access key to call the TIP-20 token at <spanx style="verb">currency</spanx> with:</t>

<t><list style="symbols">
  <t><spanx style="verb">transfer(recipient, amount)</spanx>, or</t>
  <t><spanx style="verb">transferWithMemo(recipient, amount, memo)</spanx></t>
</list></t>

<t>If that transaction settles successfully, the renewal <spanx style="verb">Payment-Receipt</spanx>
payload decodes to:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "tempo",
  "reference": "0xb4bf2b4f8e3f0e6f3b6af3a5f6d3c8e32e1c32a19fa56bd9f9b3fd33af88e912",
  "status": "success",
  "subscriptionId": "c3ViXzAxMjM0NTY",
  "timestamp": "2026-02-14T12:05:42Z"
}
]]></sourcecode></figure>

<t>The server updates <spanx style="verb">last charged billing-period index = 1</spanx>. Additional
requests during Period 1 do not permit another successful renewal
charge for Period 1.</t>

</section>
<section anchor="cancellation-at-period-end"><name>Cancellation At Period End</name>

<t>Suppose the server has already successfully charged Period 2 and the
payer cancels on <spanx style="verb">2026-03-20T09:00:00Z</spanx>.</t>

<t>The server records cancellation with an effective time of
<spanx style="verb">2026-04-15T12:03:10Z</spanx>, which is the end of Period 2. Requests before
that time continue to succeed without another renewal charge:</t>

<figure><sourcecode type="http"><![CDATA[
GET /api/resource HTTP/1.1
Host: api.example.com
Cookie: session=<application-session>
]]></sourcecode></figure>

<t>Once <spanx style="verb">2026-04-15T12:03:10Z</spanx> is reached, the server stops submitting
renewal transactions for this subscription. A later request receives a
fresh challenge:</t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 402 Payment Required
Cache-Control: no-store
WWW-Authenticate: Payment id="n3xtP3ri0d",
  realm="api.example.com",
  method="tempo",
  intent="subscription",
  request="<base64url-encoded JSON below>"
]]></sourcecode></figure>

</section>
<section anchor="failed-renewal-and-lapse"><name>Failed Renewal And Lapse</name>

<t>Suppose Period 3 begins and the server attempts a renewal transaction,
but the Tempo transaction fails because the payer no longer has enough
TIP-20 balance or fee-paying balance.</t>

<t>The server does not grant access for Period 3 and returns:</t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 402 Payment Required
Cache-Control: no-store
WWW-Authenticate: Payment id="r3tryP3ri0d",
  realm="api.example.com",
  method="tempo",
  intent="subscription",
  request="<base64url-encoded JSON below>"
]]></sourcecode></figure>

<t>If a later retry during Period 3 succeeds, the server may grant access
for Period 3 and update <spanx style="verb">last charged billing-period index = 3</spanx>.</t>

<t>If Period 4 begins before any successful renewal occurs, the next
successful Tempo transaction authorizes at most one charge for Period 4.
The elapsed unpaid Period 3 does not become extra on-chain spending
capacity, because <xref target="TIP-1011"/> periodic limits reset rather than
accumulate.</t>

</section>
<section anchor="natural-expiry"><name>Natural Expiry</name>

<t>Suppose <spanx style="verb">subscriptionExpires</spanx> is <spanx style="verb">2026-07-14T12:00:00Z</spanx>. Once that time
is reached, the signed key authorization no longer authorizes future
renewals. Requests after that time receive a fresh challenge rather than
another renewal attempt.</t>

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

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

</section>


  </back>

<!-- ##markdown-source:
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
0g0x4q2cB0kKEfw9pJ74X4JItBGRdgAA

-->

</rfc>

