<?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="August" day="07"/>

    
    
    

    <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-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>
<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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
EtINMeKtnAdJChH8PaSe+F/LtyCUkXYAAA==

-->

</rfc>

