<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CAI</title>
    <description>The latest articles on DEV Community by CAI (@cailab).</description>
    <link>https://dev.to/cailab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4008187%2F53ebe87b-4371-40f5-972c-f98143974a5f.png</url>
      <title>DEV Community: CAI</title>
      <link>https://dev.to/cailab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cailab"/>
    <language>en</language>
    <item>
      <title>Payment Intents and Hosted Actions: The Checkout Flow Between Intent and Settlement</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Fri, 14 Aug 2026 06:34:36 +0000</pubDate>
      <link>https://dev.to/cailab/payment-intents-and-hosted-actions-the-checkout-flow-between-intent-and-settlement-8lf</link>
      <guid>https://dev.to/cailab/payment-intents-and-hosted-actions-the-checkout-flow-between-intent-and-settlement-8lf</guid>
      <description>&lt;h1&gt;
  
  
  Payment Intents and Hosted Actions: The Checkout Flow Between Intent and Settlement
&lt;/h1&gt;

&lt;p&gt;A SaaS developer adds checkout to their product. A customer clicks "buy." The payment clears. The developer has never written a line of crypto code, and the customer never connected a wallet. This is the design target for the &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com checkout flow. The API behind it is a three-layer system: a payment intent that tracks state, a hosted action that replaces wallet signatures with a browser click, and a polling loop that turns that click into settlement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Intent
&lt;/h2&gt;

&lt;p&gt;Every payment starts with an intent. The &lt;code&gt;GET /payment-intent-status&lt;/code&gt; endpoint is the read side of a state machine. You pass an intent id, and the response tells you where the payment is in its lifecycle. The intent model is partial-live in the current API, the system honors &lt;code&gt;gap_id&lt;/code&gt; fields in responses and evolves as checkout scenarios expand, but the state transitions are already stable enough to build production flows around.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /payment-intent-status?id=int_abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns one of: &lt;code&gt;pending&lt;/code&gt;, &lt;code&gt;awaiting_user_confirmation&lt;/code&gt;, &lt;code&gt;confirmed&lt;/code&gt;, &lt;code&gt;completed&lt;/code&gt;, or &lt;code&gt;failed&lt;/code&gt;. The transition from &lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;awaiting_user_confirmation&lt;/code&gt; happens when the system receives a valid payment creation that needs the user to authorize it. The transition from &lt;code&gt;confirmed&lt;/code&gt; to &lt;code&gt;completed&lt;/code&gt; happens after the on-chain settlement reaches the required confirmation depth.&lt;/p&gt;

&lt;p&gt;This state machine is what separates a checkout flow from a raw transfer. A raw transfer (&lt;code&gt;POST /wallet-custodial-transfer&lt;/code&gt;) is fire-and-forget. You either get a tx hash or an error. An intent allows the system to hold state at each step, pause for user action, and resume automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hosted Action
&lt;/h2&gt;

&lt;p&gt;The hosted action link is the mechanism that bridges the gap between an API-driven agent and a human user who needs to confirm a payment. The endpoint is &lt;code&gt;POST /create-hosted-action&lt;/code&gt; with a structured JSON body. The critical field is &lt;code&gt;action_type&lt;/code&gt;. For payments, you pass &lt;code&gt;deposit&lt;/code&gt; or a specific payment-related action type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/create-hosted-action&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Content-Type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;application/json&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deposit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ETH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usdc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"local_part"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alice"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response returns a URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://cai.com/act/a1b2c3d4e5f6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-14T07:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This URL serves a single-tap confirmation page. The user opens it, sees the amount, the destination, and a confirm button. No wallet extension. No gas fee in their browser. No seed phrase. They tap confirm, and the system moves the intent from &lt;code&gt;awaiting_user_confirmation&lt;/code&gt; to &lt;code&gt;confirmed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The hosted action is the product insight that makes agent-initiated payments work in practice. An agent can create an intent, push a confirmation URL to the user's dashboard or email, and wait. The agent never handles the private key. The user never sees an opaque transaction request. Both sides of the trade get the abstraction they need.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Polling Loop
&lt;/h2&gt;

&lt;p&gt;Once the intent reaches &lt;code&gt;confirmed&lt;/code&gt;, the agent polls for settlement. The polling endpoint is the same &lt;code&gt;GET /payment-intent-status&lt;/code&gt;, now returning &lt;code&gt;completed&lt;/code&gt; with a &lt;code&gt;tx_hash&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;GET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/payment-intent-status?id=int_abc&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"int_abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tx_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x7a8b9c0d1e2f..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ETH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confirmations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"settled_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-14T06:32:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The polling cadence depends on the chain. EVM chains settle in seconds to a couple of minutes. BSC and Polygon are faster. Tron is comparable to EVM. The intent response includes &lt;code&gt;confirmations&lt;/code&gt; and a &lt;code&gt;minConfirmations&lt;/code&gt; threshold so the agent knows when settlement is considered final.&lt;/p&gt;

&lt;p&gt;For agents that need asynchronous notification instead of polling, the &lt;code&gt;POST /transfer-notify-register&lt;/code&gt; endpoint accepts an optional &lt;code&gt;webhook_url&lt;/code&gt; parameter. When the transfer settles, the system calls the webhook with the tx hash and confirmation count. This is the right pattern for high-volume checkout flows where polling every 5 seconds on 10,000 active intents would be wasteful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Flow
&lt;/h2&gt;

&lt;p&gt;Putting the three layers together, an end-to-end checkout looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The merchant's backend calls &lt;code&gt;POST /wallet-custodial-transfer&lt;/code&gt; (or creates a &lt;code&gt;marketplace_order&lt;/code&gt;) to initiate payment. The response includes an intent id.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The backend creates a hosted action link via &lt;code&gt;POST /create-hosted-action&lt;/code&gt; and returns the URL to the merchant's frontend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The merchant redirects the customer to the hosted action page. The customer sees the amount, the merchant name, and a single confirm button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The customer confirms. The backend receives a callback (or the frontend polls the intent status) showing &lt;code&gt;confirmed&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The backend starts polling &lt;code&gt;GET /payment-intent-status&lt;/code&gt; for the intent id, or waits for the webhook via &lt;code&gt;POST /transfer-notify-register&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The intent transitions to &lt;code&gt;completed&lt;/code&gt;. The backend records the tx hash and updates the order status.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The remarkable property of this flow is that step 3 never shows the customer a blockchain address, a gas fee estimate, or a transaction signing request. The checkout page looks exactly like a credit card checkout, except the settlement happens on-chain in stablecoins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails Built Into the Flow
&lt;/h2&gt;

&lt;p&gt;The hosted action flow includes two safety mechanisms that are important for production deployments.&lt;/p&gt;

&lt;p&gt;First, the daily auto-limit is capped at $200 USD per account for agent-initiated payments. This limit applies at the API key level and resets daily. It prevents a compromised key from draining an account. Users who need higher limits can adjust them in the dashboard settings at &lt;code&gt;cai.com/app&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Second, new recipients trigger a confirmation requirement. When the agent tries to send to an address or email that has never received a payment from this account before, the hosted action page shows a prominent warning about the new recipient. The user must explicitly confirm before the payment proceeds. This prevents a common attack pattern where an attacker substitutes their own address in a payment request.&lt;/p&gt;

&lt;p&gt;The vault product (credential storage and rotation) covers the case where the agent's API key itself is compromised, but that is a separate track from the payment flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Enables
&lt;/h2&gt;

&lt;p&gt;The intent-plus-hosted-action pattern is the foundation for several checkout models:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS checkout.&lt;/strong&gt; A subscription service generates a hosted action URL for each billing cycle. The user confirms once per period. No saved payment methods, no recurring charge disputes, no PCI scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-to-agent settlement.&lt;/strong&gt; Agent A needs to pay Agent B for a completed task. Agent A creates an intent and a hosted action link, which the user confirms. Both agents receive the settlement notification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-time storefront purchases.&lt;/strong&gt; A digital goods storefront generates a hosted action link at checkout. The customer confirms in one tap. The store receives the payment in USDC within seconds.&lt;/p&gt;

&lt;p&gt;Each of these models relies on the same three-layer architecture: create the intent, confirm via hosted action, poll until settlement. The abstraction is consistent whether the buyer is a human clicking a link or an agent calling an API.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Polling Implementation
&lt;/h2&gt;

&lt;p&gt;A practical polling implementation in Python looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_payment_intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;deadline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.cai.com/functions/v1/payment-intent-status?id=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;intent_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CAI_API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;intent &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;intent_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; did not settle in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For production, replace the synchronous loop with an async version or use the webhook path. The synchronous version is fine for low-volume checkout flows where the merchant processes a few hundred payments per day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Status-Code Handling
&lt;/h2&gt;

&lt;p&gt;Every endpoint in the flow follows the same error contract as the rest of the CAI API. &lt;code&gt;401&lt;/code&gt; means the API key is invalid or expired. &lt;code&gt;403&lt;/code&gt; means the key has insufficient scope (checkouts require &lt;code&gt;pay&lt;/code&gt; or &lt;code&gt;full&lt;/code&gt; scope). &lt;code&gt;429&lt;/code&gt; means rate limiting. Back off and retry with exponential delay.&lt;/p&gt;

&lt;p&gt;The intent-specific error codes include a &lt;code&gt;gap_id&lt;/code&gt; field when the requested feature is still partial-live. Treat a &lt;code&gt;gap_id&lt;/code&gt; response the same way you treat a &lt;code&gt;503&lt;/code&gt;: the feature exists but has limitations. Check the capabilities page at &lt;code&gt;cai.com/capabilities&lt;/code&gt; for the current status of each feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The checkout flow built on payment intents and hosted actions solves a specific problem: how does an agent initiate a payment and get confirmation from a human user without sharing private keys, without asking the user to install a wallet, and without requiring the merchant to hold crypto? The answer is a stateful intent, a single-tap confirmation page, and a polling loop. The settlement happens in USDC on chain, but neither the buyer nor the seller touches the blockchain directly.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/capabilities.html&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  If You Tried the Checkout Flow and Hit a Bug
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt;  the curl command, the create-hosted-action request, the intent id you polled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt;  the checkout to complete in one line, or the intent to transition to completed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt;  the error message, the unexpected status, the timeout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt;  OS, Node or Python version, the MCP host (OpenClaw, Hermes, Codex, Cursor, or other), the CAI account tier.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>payments</category>
    </item>
    <item>
      <title>The @cai.com wallet API: balances, transfers, and the hosted-action flow</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Wed, 12 Aug 2026 06:34:06 +0000</pubDate>
      <link>https://dev.to/cailab/the-caicom-wallet-api-balances-transfers-and-the-hosted-action-flow-4m9k</link>
      <guid>https://dev.to/cailab/the-caicom-wallet-api-balances-transfers-and-the-hosted-action-flow-4m9k</guid>
      <description>&lt;h1&gt;
  
  
  The &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com wallet API: balances, transfers, and the hosted-action flow
&lt;/h1&gt;

&lt;p&gt;The wallet is the most-requested deep-dive from the &lt;a href="https://dev.to/cailab/the-four-product-pillars-of-caicom-email-wallet-vault-agent-surface-5cik"&gt;four-pillars post&lt;/a&gt;. This post walks through the wallet API in detail: how to check balances, how to send a payment, how the user-confirmation pattern works, and the difference between custodial and self-custody.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wallet in one sentence
&lt;/h2&gt;

&lt;p&gt;A custodial multi-chain stablecoin wallet. Six chains. External wallets supported. MoonPay for fiat on-ramp. One custodial account for pay, transfer, convert, and bridge. No private key in chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking balances
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;POST /get-wallet-balances&lt;/code&gt; endpoint returns the user's balances on one or more chains. The request is a JSON body with the chains and tokens to query.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/get-wallet-balances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "chains": ["ETH", "polygon", "base"],
    "tokens": ["USDC", "USDT"]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes the custodial &lt;code&gt;wallet_binding&lt;/code&gt; addresses and any linked subwallets (read-only RPC for the external wallets the user has connected). Entries may include &lt;code&gt;linked_subwallet: true&lt;/code&gt; for external wallet balances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common gotcha.&lt;/strong&gt; If you query a chain the user hasn't deposited to yet, the response may include empty activity for that chain. That is expected behavior; the chain is supported, the indexer just hasn't seen any activity for this user yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sending a payment
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;POST /wallet-custodial-transfer&lt;/code&gt; endpoint initiates a payment. The response is a hosted-action URL. The user opens it, sees the recipient, the amount, and the chain, and taps once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/wallet-custodial-transfer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "to_address": "0x...",
    "amount": "10.00",
    "chain": "base",
    "token": "USDC"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transfer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tx_..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hosted_action_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://cai.com/act/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-04T12:34:56Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The hosted-action URL is the user-confirmation pattern. The agent's API key is the authorization to call the CAI API on the user's behalf, but every transfer still needs the user's consent on the hosted-action page. The page is HTTPS, the tap is bound to a single transaction, and the URL expires in a short window. If the user does nothing, the payment does not go through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polling for the receipt
&lt;/h2&gt;

&lt;p&gt;After the user taps once, the agent polls &lt;code&gt;POST /transfer-status&lt;/code&gt; for the receipt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/transfer-status &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"tx_hash": "0x..."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes the on-chain tx hash when the transfer is confirmed. The agent can then show the receipt to the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custodial vs self-custody
&lt;/h2&gt;

&lt;p&gt;A custodial wallet means the user does not hold the private key. CAI holds it. The user gets a &lt;code&gt;@cai.com&lt;/code&gt; address on each of six chains and can pay, transfer, convert, and bridge from any of them.&lt;/p&gt;

&lt;p&gt;The difference from self-custody is the user-confirmation pattern. With self-custody, the user holds the key, signs each transaction, and is responsible for key management. With CAI's custodial wallet, the user holds the address and the user-confirmation tap; CAI holds the key and the signing infrastructure. The trade-off: CAI is a trusted third party for custody, but the user never has to paste a private key into an agent conversation.&lt;/p&gt;

&lt;p&gt;External wallets are supported. Connect a MetaMask or a Ledger and the user keeps custody of their external assets while using CAI for the day-to-day. The external wallets appear as linked subwallets in the &lt;code&gt;get-wallet-balances&lt;/code&gt; response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guardrails.&lt;/strong&gt; The wallet has a $200/day auto-limit while CAI completes its security audit. New recipients and new devices always require confirmation. Think of it like cash in your pocket, perfect for daily spending. The vault product (multi-sig, time-locks) is coming for larger balances.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top-up flows
&lt;/h2&gt;

&lt;p&gt;To add funds to the wallet, the user can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send from an external wallet&lt;/strong&gt; to the CAI custodial address on the chosen chain. The address is in the account dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buy with MoonPay&lt;/strong&gt; (fiat on-ramp). The account dashboard has a "Buy with MoonPay" button for each chain. MoonPay is a third-party service; regional availability and KYC requirements apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use WeChat Pay&lt;/strong&gt; (Planned). The WeChat Pay path is documented in &lt;code&gt;cai.com/capabilities.html&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each top-up flow eventually surfaces a hosted-action URL or a direct deposit link that the user completes on the chosen rail.&lt;/p&gt;

&lt;p&gt;The wallet API is in &lt;code&gt;cai.com/skill.md&lt;/code&gt;. The hosted-action flow is in &lt;code&gt;cai.com/agent-payment.html&lt;/code&gt;. Apply at &lt;code&gt;cai.com/app&lt;/code&gt; to get a wallet.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you wired the wallet API and got an unexpected balance, a 5xx, or a missing &lt;code&gt;wallet_binding&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt; -- the install command, the request, the MCP host config. Copy the actual command or request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt; -- one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt; -- the error message, the empty response, the unexpected behavior. Paste it verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt; -- OS, Node version, the MCP host (OpenClaw / Hermes / Codex / Cursor / other), the CAI account tier if relevant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Accepting payments with @cai.com: adding CAI checkout to your website or SaaS</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Fri, 07 Aug 2026 06:29:06 +0000</pubDate>
      <link>https://dev.to/cailab/accepting-payments-with-caicom-adding-cai-checkout-to-your-website-or-saas-2h9a</link>
      <guid>https://dev.to/cailab/accepting-payments-with-caicom-adding-cai-checkout-to-your-website-or-saas-2h9a</guid>
      <description>&lt;h1&gt;
  
  
  Accepting payments with &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com: adding CAI checkout to your website or SaaS
&lt;/h1&gt;

&lt;p&gt;A SaaS developer wants to accept payments without a merchant account, without chargebacks, and without asking customers to leave the checkout flow. A marketplace needs to collect payments from buyers and settle them to sellers. An AI agent needs to pay for API access programmatically. All three scenarios converge on the same problem: how does money move from payer to payee without a Plaid link, a Stripe onboarding, or a wallet address pasted in chat?&lt;/p&gt;

&lt;p&gt;The &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com payment path covers two sides. The payer side (an agent paying from a CAI wallet, or a human tapping a hosted confirmation page) has been covered elsewhere. This post covers the merchant side: how to accept payments through CAI, what the API looks like, and where the honest limits are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two payment paths for merchants
&lt;/h2&gt;

&lt;p&gt;CAI exposes two distinct receive paths, and the choice between them depends on how the customer pays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Card (fiat) path:&lt;/strong&gt; &lt;code&gt;create_onramp_url&lt;/code&gt; returns a MoonPay-hosted URL where the customer pays by credit card. The funds land in the merchant's custodial EVM address as USDC (or the selected stablecoin). The merchant needs a CAI API key with &lt;code&gt;pay&lt;/code&gt; or &lt;code&gt;full&lt;/code&gt; scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crypto path:&lt;/strong&gt; &lt;code&gt;create_deposit_link&lt;/code&gt; returns a CAI-hosted page (&lt;code&gt;/act/&amp;lt;token&amp;gt;&lt;/code&gt;) showing the merchant's custodial addresses and QR codes. The customer sends crypto from their own wallet, and the deposit is indexed by CAI's activity feed.&lt;/p&gt;

&lt;p&gt;The two paths are not interchangeable. Card works for customers who hold fiat. Crypto works for customers who hold USDC or other supported tokens. The merchant can offer both, or one, depending on their customer base.&lt;/p&gt;

&lt;h2&gt;
  
  
  The card path: create_onramp_url
&lt;/h2&gt;

&lt;p&gt;The card path routes through MoonPay, which handles the fiat-to-crypto conversion, compliance checks, and card network processing. The merchant does not need a separate MoonPay account. The CAI API key is the only credential.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/create-onramp-url &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "amount_usd": 50.00,
    "default_currency_code": "usdc_eth"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes a &lt;code&gt;url&lt;/code&gt; that the merchant redirects (or links) the customer to. The customer fills in their card details on MoonPay's hosted page, and the crypto lands in the merchant's custodial EVM address. The &lt;code&gt;walletAddress&lt;/code&gt; is set server-side to the API key owner's custodial address, so the merchant does not need to specify a destination.&lt;/p&gt;

&lt;p&gt;This is not a full payment processor. There is no cart abstraction, no order webhook, and no inventory management. The receipt is the MoonPay payment intent. The merchant confirms the payment by polling &lt;code&gt;GET /payment-intent-status&lt;/code&gt; with the intent id, or by checking &lt;code&gt;GET /wallet-activity-list&lt;/code&gt; for the incoming deposit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limit:&lt;/strong&gt; MoonPay is a third-party provider. KYC requirements and regional availability apply. If MoonPay is unavailable for a given region (the API returns a 503 with &lt;code&gt;GAP_ONRAMP_V1&lt;/code&gt;), the card path is unavailable for that customer. The honest fallback is the crypto deposit path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The crypto path: create_deposit_link
&lt;/h2&gt;

&lt;p&gt;For customers who already hold crypto, the deposit path is simpler. The merchant calls &lt;code&gt;create_deposit_link&lt;/code&gt; and gets a CAI-hosted page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/create-hosted-action &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "action_type": "deposit"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response is a &lt;code&gt;url&lt;/code&gt; like &lt;code&gt;https://cai.com/act/&amp;lt;token&amp;gt;&lt;/code&gt;. The merchant sends this URL to the customer. The customer opens it, sees the merchant's custodial addresses and QR codes for each chain, and sends crypto from their wallet. The deposit is indexed by CAI's activity feed and appears in &lt;code&gt;GET /wallet-activity-list&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The deposit link is single-use and short-lived. The customer has a window to complete the deposit before the URL expires. The merchant can verify the deposit by polling &lt;code&gt;GET /wallet-deposit-activity&lt;/code&gt; or &lt;code&gt;GET /wallet-activity-list&lt;/code&gt; with the customer's name or reference.&lt;/p&gt;

&lt;p&gt;For the crypto path, the merchant's custodial address is printed on the page. The customer sends from their own wallet, whether that is a CAI wallet, a MetaMask, a Ledger, or any other wallet that supports the target chain. The merchant does not need to know which wallet the customer uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hosted action pattern
&lt;/h2&gt;

&lt;p&gt;Both paths build on the same hosted action infrastructure. A hosted action URL is a CAI-hosted page that the payer or the customer opens in a browser. The page is HTTPS, the token is single-use, and the URL expires in a short window (typically 15 minutes). The page does not require the visitor to have a CAI account.&lt;/p&gt;

&lt;p&gt;The hosted action is the user-confirmation surface. The payer sees the recipient, the amount, the chain, and taps once. The merchant sees the confirmation on the other side. The hosted action pattern is the same regardless of whether the flow is a deposit, a transfer, a login, or a wallet connect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Confirming the payment
&lt;/h2&gt;

&lt;p&gt;After the customer completes the payment (card or crypto), the merchant needs to confirm it landed. The confirmation tool depends on the payment method.&lt;/p&gt;

&lt;p&gt;For card payments via MoonPay, the merchant polls &lt;code&gt;GET /payment-intent-status&lt;/code&gt; with the payment intent id returned by the MoonPay flow. The response includes the status, the on-chain tx hash, and the confirmation count.&lt;/p&gt;

&lt;p&gt;For crypto deposits, the merchant reads from the activity feed. &lt;code&gt;GET /wallet-activity-list&lt;/code&gt; with &lt;code&gt;direction: "in"&lt;/code&gt; and &lt;code&gt;category: "deposit"&lt;/code&gt; returns the indexed deposits. If the deposit is not yet indexed, &lt;code&gt;GET /wallet-deposit-activity&lt;/code&gt; or &lt;code&gt;POST /wallet-deposit-confirm&lt;/code&gt; (with the tx hash) can surface it.&lt;/p&gt;

&lt;p&gt;The distinction matters: card payments are confirmed through the payment intent API, not through the transfer status API. Crypto deposits are confirmed through the activity feed, not through the transfer status API. The transfer status API is for outbound custodial transfers, not for incoming deposits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails and honest limits
&lt;/h2&gt;

&lt;p&gt;CAI's receive path is designed for daily spending, not for treasury-sized balances. The $200/day auto-limit applies while the security audit completes. New recipients and new devices always require confirmation. Think of it like cash in your pocket, perfect for daily spending. The vault product (multi-sig, time-locks) is coming for larger balances.&lt;/p&gt;

&lt;p&gt;The card path routes through MoonPay, which is a third-party provider. KYC and region limits apply. The crypto path is self-service: the customer sends from their wallet, and the merchant confirms on the activity feed.&lt;/p&gt;

&lt;p&gt;The receive path is not a full payment processor. There is no cart, no order webhook, no inventory management, and no chargeback handling. The merchant handles the business logic of linking a payment to an order, and CAI handles the settlement.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you tried the receive flow and hit a bug
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt; -- the API call, the hosted action URL, the curl command. Copy the actual request or the page URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt; -- one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt; -- the error message, the empty response, the unexpected behavior. Paste it verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt; -- OS, Node version, the MCP host (OpenClaw / Hermes / Codex / Cursor / other), the CAI account tier if relevant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>payments</category>
    </item>
    <item>
      <title>Setting up your agent's operating account: sign up at cai.com/app in 4 steps</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Wed, 05 Aug 2026 06:36:57 +0000</pubDate>
      <link>https://dev.to/cailab/setting-up-your-agents-operating-account-sign-up-at-caicomapp-in-4-steps-3i08</link>
      <guid>https://dev.to/cailab/setting-up-your-agents-operating-account-sign-up-at-caicomapp-in-4-steps-3i08</guid>
      <description>&lt;h1&gt;
  
  
  Setting up your agent's operating account: sign up at cai.com/app in 4 steps
&lt;/h1&gt;

&lt;p&gt;Your agent needs an operating account. Here is how to set one up in about 2 minutes, no card required, no private key to paste in chat.&lt;/p&gt;

&lt;p&gt;The signup at &lt;code&gt;cai.com/app&lt;/code&gt; is four steps. This post walks through each step with what the user sees, the actual fields, and what to do if a step fails. The steps below match the current &lt;code&gt;cai.com/app&lt;/code&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Open cai.com/app and pick "Apply for &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com email"
&lt;/h2&gt;

&lt;p&gt;Go to &lt;code&gt;cai.com/app&lt;/code&gt;. The page has a single CTA: "Apply for &lt;code&gt;@cai.com&lt;/code&gt; email." Click it. The first form field is your name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Enter your name
&lt;/h2&gt;

&lt;p&gt;That's the only field on the first screen. There is no email field on this step; the email is collected next. Enter your name, click continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Enter your existing email (this is where the 6-digit code goes)
&lt;/h2&gt;

&lt;p&gt;CAI emails a 6-digit verification code to the address you provide. The code expires in 15 minutes. Enter the code into the form when it arrives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the code doesn't arrive:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check spam. CAI's verification email is plain text with a 6-digit code; some providers sort it to spam if you haven't seen mail from &lt;code&gt;cai.com&lt;/code&gt; before.&lt;/li&gt;
&lt;li&gt;Wait 60 seconds. The email is sent immediately after you submit the form, but delivery can lag.&lt;/li&gt;
&lt;li&gt;Click "Resend code" if the form has the option. A new code invalidates the old one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If the code expires before you paste it:&lt;/strong&gt; you can request a new one from the same form. The old code is invalidated; the new code has a fresh 15-minute window. There is no waiting for support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Enter the code, create a password, and you're done
&lt;/h2&gt;

&lt;p&gt;Enter the 6-digit code, set a password (8+ characters, the form's complexity rules apply), and the signup completes. You are redirected to the account dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you have at the end
&lt;/h2&gt;

&lt;p&gt;After the four steps, you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;@cai.com&lt;/code&gt; email address. The SMTP/IMAP credentials are in the account dashboard if you want to use a desktop client.&lt;/li&gt;
&lt;li&gt;A custodial multi-chain stablecoin wallet. The wallet is empty until you top it up; the &lt;a href="https://dev.to/cailab/the-four-product-pillars-of-caicom-email-wallet-vault-agent-surface-5cik"&gt;four product pillars post&lt;/a&gt; covers the wallet in detail.&lt;/li&gt;
&lt;li&gt;A user vault for site credentials. Empty until you add credentials; the same post covers the vault.&lt;/li&gt;
&lt;li&gt;An API key for the agent you build or use. The key is in the account dashboard. Free tier covers read scopes; &lt;code&gt;pay&lt;/code&gt; and &lt;code&gt;full&lt;/code&gt; scopes may require verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The wallet has a $200/day auto-limit while CAI completes its security audit. New recipients and new devices always require confirmation. Think of it like cash in your pocket, perfect for daily spending. The vault product (multi-sig, time-locks) is coming for larger balances.&lt;/p&gt;

&lt;p&gt;The signup takes about 2 minutes. No card is required. The email is free.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next (technical reader)
&lt;/h2&gt;

&lt;p&gt;If you are the technical reader, the one who reads dev.to to install things, the next step is &lt;code&gt;npm i -g @cailab/mcp&lt;/code&gt;. The package drops the CAI MCP server into any MCP-compatible host: OpenClaw, Hermes, Codex, Cursor. The full quickstart is in &lt;code&gt;cai.com/developers.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The contract an agent reads first is &lt;code&gt;cai.com/skill.md&lt;/code&gt;. The companion artifact is the A2A Agent Card at &lt;code&gt;cai.com/.well-known/agent.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the agent logs in on your behalf
&lt;/h2&gt;

&lt;p&gt;Once the account exists, the agent does not need your password. The CAI API exposes a hosted login flow: an agent calls &lt;code&gt;POST /create-hosted-action&lt;/code&gt; with &lt;code&gt;{ "action_type": "login" }&lt;/code&gt; and gets back a &lt;code&gt;url&lt;/code&gt;. That URL is a CAI-hosted page the user opens and confirms. The agent never types your credentials into chat, and the login link is one-time and short-lived.&lt;/p&gt;

&lt;p&gt;That pattern is the same shape as the wallet's user-confirmation flow. The agent's API key is the authorization; the user's tap on a hosted page is the consent. You keep the password, and the agent keeps the ability to act on your behalf within the confirmations you allow.&lt;/p&gt;

&lt;p&gt;Apply at &lt;code&gt;cai.com/app&lt;/code&gt;. The signup is four steps, about 2 minutes, no card.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you went through the signup flow described above and the code didn't arrive, expired too fast, or failed silently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt;: the install command, the request, the MCP host config. Copy the actual command or request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt;: one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt;: the error message, the empty response, the unexpected behavior. Paste it verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt;: OS, Node version, the MCP host (OpenClaw / Hermes / Codex / Cursor / other), the CAI account tier if relevant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Pay Anyone by Their Name: How the @cai.com Directory Replaces Wallet Addresses</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Fri, 31 Jul 2026 07:04:16 +0000</pubDate>
      <link>https://dev.to/cailab/pay-anyone-by-their-name-how-the-caicom-directory-replaces-wallet-addresses-129k</link>
      <guid>https://dev.to/cailab/pay-anyone-by-their-name-how-the-caicom-directory-replaces-wallet-addresses-129k</guid>
      <description>&lt;p&gt;Sending a friend 20 USDC should not require copying a hex string from a chat app, checking the chain, and hoping the network matches. The &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com directory replaces wallet addresses with handles. Type the name, pick the handle, and the money moves.&lt;/p&gt;

&lt;p&gt;This post covers the &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com address directory, how it resolves handles to wallets, and how person-to-person payments work without the user ever seeing a hex string.&lt;/p&gt;

&lt;h2&gt;
  
  
  The directory
&lt;/h2&gt;

&lt;p&gt;The &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com directory maps every registered user to their custodial wallet addresses across six chains. When you sign up at cai.com/app, you get a handle like &lt;code&gt;alice@cai.com&lt;/code&gt; and a wallet address on each supported chain. The directory stores the mapping.&lt;/p&gt;

&lt;p&gt;The directory is not a blockchain itself. It is a lookup table that CAI maintains. The agent that needs to pay someone calls &lt;code&gt;resolve-transfer-recipient&lt;/code&gt; with the recipient's email or handle, and gets back the canonical address on the requested chain.&lt;/p&gt;

&lt;p&gt;The API call is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/resolve-transfer-recipient &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"chain": "BASE", "to_email": "friend@cai.com"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"canonical_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"friend@cai.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How payments work through the directory
&lt;/h2&gt;

&lt;p&gt;Once the address is resolved, the agent initiates the transfer. The user confirms on a hosted-action page, and CAI executes the custodial transfer on the requested chain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/wallet-custodial-transfer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "chain": "BASE",
    "token": "usdc",
    "amount": "20.00",
    "to_email": "friend@cai.com"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the &lt;code&gt;to_email&lt;/code&gt; field. The agent never touches a wallet address. It resolves the handle, then passes the handle back to the transfer endpoint. CAI handles the address resolution internally on the second call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The public surface
&lt;/h2&gt;

&lt;p&gt;The directory also has a public facing side. The &lt;code&gt;cai.com/.well-known/agent.json&lt;/code&gt; file is the A2A Agent Card that lets other agents discover how to interact with CAI. The &lt;code&gt;cai.com/capabilities.html&lt;/code&gt; page lists which features are live, which are in beta, and which carry gap IDs.&lt;/p&gt;

&lt;p&gt;For the &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com address directory specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live&lt;/strong&gt; (per capabilities.html): The directory is operational. All registered users are discoverable by their &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com handle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chain support&lt;/strong&gt;: ETH, BASE, POLYGON, SOLANA, ARBITRUM, and OPTIMISM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap ID&lt;/strong&gt;: GAP_RESOLVE_V1 — signals that the resolution is live but may not cover every edge case (e.g., unregistered handles return a clear error, not a silent fail).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this means for agents
&lt;/h2&gt;

&lt;p&gt;An agent that needs to pay someone does not need to ask for a wallet address. It asks for the person's &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com handle. The agent resolves it, checks the balance, and initiates the transfer. The user confirms with one tap.&lt;/p&gt;

&lt;p&gt;This is the same flow whether the agent is paying a freelancer, settling a split bill, or sending a recurring payment to a landlord. The directory abstracts the chain complexity. The agent works with names, not addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The end-to-end
&lt;/h2&gt;

&lt;p&gt;A complete payment flow through the directory:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent calls &lt;code&gt;get-identity&lt;/code&gt; to confirm the user has a CAI account.&lt;/li&gt;
&lt;li&gt;Agent asks the user for the recipient's &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com handle.&lt;/li&gt;
&lt;li&gt;Agent calls &lt;code&gt;resolve-transfer-recipient&lt;/code&gt; with the handle and the preferred chain.&lt;/li&gt;
&lt;li&gt;Agent calls &lt;code&gt;get-wallet-balances&lt;/code&gt; to confirm sufficient funds.&lt;/li&gt;
&lt;li&gt;Agent calls &lt;code&gt;wallet-custodial-transfer&lt;/code&gt; with the recipient's handle.&lt;/li&gt;
&lt;li&gt;User confirms on the hosted-action page.&lt;/li&gt;
&lt;li&gt;Agent confirms the payment landed via &lt;code&gt;wallet-activity-list&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every step works with the handle. The agent never sees a private key, never copies a hex address, and never asks which network the recipient is on.&lt;/p&gt;




&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

&lt;p&gt;If you tried this flow and hit a bug, comment below with the command you ran, what you expected, and what you got. Bug reports get replied to within 24 hours.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>payments</category>
    </item>
    <item>
      <title>How AI Agents Pay for APIs: x402, Payment Mandates, and the Agent Operating Account</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Wed, 29 Jul 2026 09:51:45 +0000</pubDate>
      <link>https://dev.to/cailab/how-ai-agents-pay-for-apis-x402-payment-mandates-and-the-agent-operating-account-168b</link>
      <guid>https://dev.to/cailab/how-ai-agents-pay-for-apis-x402-payment-mandates-and-the-agent-operating-account-168b</guid>
      <description>&lt;h1&gt;
  
  
  How AI Agents Pay for APIs: x402, Payment Mandates, and the Agent Operating Account
&lt;/h1&gt;

&lt;p&gt;The HTTP 402 status code has been reserved for "Payment Required" since 1998. For most of the web's history, it sat unused. But AI agents making API calls autonomously are finally giving it real traffic.&lt;/p&gt;

&lt;p&gt;When an agent hits a paid API endpoint, the question shifts from "can it pay?" to "how does it pay without waking a human for every dollar?" That breaks into two parts: a protocol for agent-to-API payment (x402) and a delegation mechanism (payment mandates) that lets agents spend within user-defined limits without asking permission each time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The x402 flow
&lt;/h2&gt;

&lt;p&gt;The x402 protocol is straightforward. An agent calls an API endpoint. The API responds with HTTP 402, including a payment challenge in the response body. The challenge specifies the recipient address, amount, chain, and token. The agent forwards this challenge to a payer service, which checks the user's balance and executes the transfer.&lt;/p&gt;

&lt;p&gt;CAI's implementation uses three endpoints.&lt;/p&gt;

&lt;p&gt;First, &lt;code&gt;POST /x402-payment-prepare&lt;/code&gt; takes the challenge from the API and checks whether the user has sufficient balance and whether an active mandate covers this merchant. It returns an &lt;code&gt;attempt_id&lt;/code&gt; and a &lt;code&gt;requires_user_confirm&lt;/code&gt; flag. When the user has set up a payment mandate for this domain, the flag is false and the agent can proceed.&lt;/p&gt;

&lt;p&gt;Second, the agent calls &lt;code&gt;POST /x402-payment-execute&lt;/code&gt; with the &lt;code&gt;attempt_id&lt;/code&gt; and &lt;code&gt;user_confirmed: true&lt;/code&gt; (or skips confirm when the mandate covers it). CAI executes the custodial transfer on the requested chain and returns a &lt;code&gt;tx_hash&lt;/code&gt; as proof.&lt;/p&gt;

&lt;p&gt;Third, the agent re-requests the paid API resource, attaching the &lt;code&gt;tx_hash&lt;/code&gt; or &lt;code&gt;x402_retry_hint&lt;/code&gt; from CAI's response. The API verifies the on-chain payment and serves the resource.&lt;/p&gt;

&lt;p&gt;The retry is the agent's responsibility. CAI returns the proof of payment. The agent presents it to the seller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payment mandates: spending limits for autonomous agents
&lt;/h2&gt;

&lt;p&gt;The mandate system is the more interesting piece. A payment mandate is a user-created permission that lets an agent spend up to certain limits on a specific merchant domain without asking for confirmation every time.&lt;/p&gt;

&lt;p&gt;The flow starts with &lt;code&gt;POST /payment-mandate-create&lt;/code&gt;. The user specifies the &lt;code&gt;merchant_domain&lt;/code&gt;, a &lt;code&gt;max_amount_per_payment_usd&lt;/code&gt;, a &lt;code&gt;daily_cap_usd&lt;/code&gt;, optional &lt;code&gt;allowed_resource_patterns&lt;/code&gt;, and an &lt;code&gt;expires_in_hours&lt;/code&gt; value. The user approves the mandate through CAI's hosted verification page. Once active, the agent can call &lt;code&gt;x402_payment_prepare&lt;/code&gt; for any charge on that domain, and the response sets &lt;code&gt;requires_user_confirm: false&lt;/code&gt; as long as the charge stays within the mandate's limits.&lt;/p&gt;

&lt;p&gt;The user can revoke the mandate at any time with &lt;code&gt;POST /payment-mandate-revoke&lt;/code&gt; or inspect active mandates with &lt;code&gt;GET /payment-mandate-status&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This follows the same pattern as the AP2 (Authorization Protocol for Payments) concept, but CAI's implementation is a CAI-native version. The system enforces spending caps per payment and per day, and the domain pattern matching limits which API endpoints the mandate covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the agent gets its wallet
&lt;/h2&gt;

&lt;p&gt;Before any of this works, the agent needs a wallet to pay from. CAI's model is a custodial multi-chain wallet accessed via API key. The agent calls &lt;code&gt;GET /get-identity&lt;/code&gt; to confirm the account exists, then &lt;code&gt;POST /get-wallet-balances&lt;/code&gt; to check balances on the relevant chain.&lt;/p&gt;

&lt;p&gt;If the balance is insufficient, the agent can generate a deposit link with &lt;code&gt;POST /create-hosted-action&lt;/code&gt; (with &lt;code&gt;action_type: "deposit"&lt;/code&gt;) or use the fiat on-ramp via MoonPay (third-party KYC applies). The agent does not handle private keys. It calls the CAI API, and CAI executes the custodial transfer.&lt;/p&gt;

&lt;p&gt;The full sequence is documented in the skill.md contract at &lt;code&gt;https://api.cai.com/functions/v1&lt;/code&gt;, which is the single source of truth for all endpoints, scopes, and gap IDs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP path
&lt;/h2&gt;

&lt;p&gt;For agents that use the Model Context Protocol, the &lt;code&gt;@cailab/mcp&lt;/code&gt; npm package provides a stdio transport that exposes the same set of tools. The agent sets &lt;code&gt;CAI_API_KEY&lt;/code&gt; as an environment variable and the MCP server handles the authentication and routing. The same x402 endpoints, mandate tools, and wallet operations are available through the MCP interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early access guardrails
&lt;/h2&gt;

&lt;p&gt;Since this is early access, CAI applies a $200 per day automatic spending limit. New recipients and new devices need user confirmation before the first transfer. The vault product for storing third-party site credentials is also available, which lets agents store and retrieve login credentials for platforms they interact with.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest label
&lt;/h2&gt;

&lt;p&gt;The capabilities page at &lt;code&gt;cai.com/capabilities.html&lt;/code&gt; marks x402 as Live and payment mandates as Live. Both carry gap IDs (&lt;code&gt;GAP_X402_V1&lt;/code&gt;, &lt;code&gt;GAP_PAYMENT_MANDATE_V1&lt;/code&gt;) that signal the implementation is operational but may not cover every edge case. The gap IDs are part of the API response, so agents can check them and adjust their behavior accordingly.&lt;/p&gt;

&lt;p&gt;WeChat Pay is listed as Planned. Bridge and cross-chain transfers are Live (with &lt;code&gt;GAP_BRIDGE_V1&lt;/code&gt;). The fiat on-ramp via MoonPay is Live with third-party KYC limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for agent developers
&lt;/h2&gt;

&lt;p&gt;Agent-to-API payment is no longer a design problem you need to solve from scratch. The x402 protocol gives you a standard way to handle HTTP 402 challenges. The mandate system lets agents operate autonomously within user-defined limits. The custodial wallet model means the agent never touches a private key.&lt;/p&gt;

&lt;p&gt;The API contract lives at &lt;code&gt;cai.com/skill.md&lt;/code&gt;. The MCP package is on npm. The capabilities matrix is at &lt;code&gt;cai.com/capabilities.html&lt;/code&gt;. The agent calls &lt;code&gt;get_identity&lt;/code&gt;, checks balances, and pays when it needs to.&lt;/p&gt;

&lt;p&gt;The 402 status code has been waiting for a use case since 1998. AI agents might be the one that finally makes it stick.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>payments</category>
    </item>
    <item>
      <title>Build an AI Agent That Reads Invoices and Pays Them: A CAI Tutorial</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Fri, 24 Jul 2026 06:35:45 +0000</pubDate>
      <link>https://dev.to/cailab/build-an-ai-agent-that-reads-invoices-and-pays-them-a-cai-tutorial-1i35</link>
      <guid>https://dev.to/cailab/build-an-ai-agent-that-reads-invoices-and-pays-them-a-cai-tutorial-1i35</guid>
      <description>&lt;h2&gt;
  
  
  Build an AI Agent That Reads Invoices and Pays Them: A CAI Tutorial
&lt;/h2&gt;

&lt;p&gt;Most AI agents today can reason, plan, and call APIs. But give one a PDF invoice and ask it to pay the bill, and it stops cold. The agent can't read your email to find the invoice. It can't check its wallet balance. It has no wallet at all.&lt;/p&gt;

&lt;p&gt;This tutorial walks through building an agent that does the full loop: read an invoice from email, check the balance, and pay the bill. All via CAI's MCP API, no external wallet or email provider needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install the CAI MCP Server
&lt;/h3&gt;

&lt;p&gt;The CAI MCP server exposes email, wallet, vault, and identity tools as standard MCP tools. Install it with npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @cailab/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure the MCP host. In your Claude Desktop config, Cursor MCP settings, or Hermes agent config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cai"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@cailab/mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CAI_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cai_..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get your API key at &lt;code&gt;https://cai.com/app&lt;/code&gt; with at least &lt;code&gt;read&lt;/code&gt; scope for identity and balance checks, and &lt;code&gt;pay&lt;/code&gt; or &lt;code&gt;full&lt;/code&gt; scope for transfers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Verify the Agent Identity
&lt;/h3&gt;

&lt;p&gt;Every CAI API call starts with identity verification. The first call returns the user's &lt;code&gt;@cai.com&lt;/code&gt; email, linked wallet addresses, and account status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/get-identity &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes &lt;code&gt;linked_wallets&lt;/code&gt; with chain addresses and a &lt;code&gt;wallet_binding&lt;/code&gt; object. This is the agent's on-chain identity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Read the Inbox for Invoices
&lt;/h3&gt;

&lt;p&gt;The CAI email product gives every user a &lt;code&gt;@cai.com&lt;/code&gt; address. The &lt;code&gt;mail-chat&lt;/code&gt; endpoint lets the agent ask natural-language questions about recent mail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/mail-chat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"message": "Show me the most recent invoice or payment request from the last 7 days"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For structured extraction, use &lt;code&gt;mail-summarize-actions&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/mail-summarize-actions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns a structured summary with suggested actions, including copyable codes and openable URLs from the email content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Check the Wallet Balance
&lt;/h3&gt;

&lt;p&gt;Before paying, the agent checks the wallet on the relevant chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/get-wallet-balances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"chains": ["ETH", "BASE", "POLYGON"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response shows balances for native tokens plus USDC, USDT, and DAI on each chain. If the balance is short, the agent can mint a deposit link:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/create-hosted-action &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"action_type": "deposit"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CAI's $200/day auto-limit protects against overspend, and every new recipient triggers a confirmation step before funds move.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Resolve the Payee and Transfer
&lt;/h3&gt;

&lt;p&gt;The agent resolves the recipient's &lt;code&gt;@cai.com&lt;/code&gt; address to a wallet address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/resolve-transfer-recipient &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"chain": "ETH", "to_email": "vendor@cai.com"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response returns &lt;code&gt;canonical_email&lt;/code&gt; and &lt;code&gt;to_address&lt;/code&gt;. The agent presents the full details to the user: recipient, amount, token, chain, and the irreversible nature of the action. Once confirmed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/wallet-custodial-transfer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "chain": "ETH",
    "token": "usdc",
    "amount": "49.99",
    "to_email": "vendor@cai.com"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent then confirms the payment with &lt;code&gt;wallet-activity-list&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/wallet-activity-list &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"limit": 5, "direction": "out"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Store Recurring Payment Credentials
&lt;/h3&gt;

&lt;p&gt;For recurring bills, the vault stores site credentials so the agent can log in and download invoices on future cycles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://api.cai.com/functions/v1/user-site-credentials &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "origin_url": "https://vendor.com",
    "kind": "password",
    "payload": {"username": "user@cai.com", "password": "..."}
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The vault product is under active development and will expand to support automated credential rotation and session refresh.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Full Agent Loop
&lt;/h3&gt;

&lt;p&gt;Putting it all together, the agent's bill-pay flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User says "pay the electric bill"&lt;/li&gt;
&lt;li&gt;Agent calls &lt;code&gt;mail-chat&lt;/code&gt; to find the latest invoice email&lt;/li&gt;
&lt;li&gt;Agent extracts the amount and due date&lt;/li&gt;
&lt;li&gt;Agent calls &lt;code&gt;get-wallet-balances&lt;/code&gt; to confirm sufficient funds&lt;/li&gt;
&lt;li&gt;Agent resolves the payee with &lt;code&gt;resolve-transfer-recipient&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Agent presents the details to the user for confirmation&lt;/li&gt;
&lt;li&gt;User confirms, agent calls &lt;code&gt;wallet-custodial-transfer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Agent confirms the payment landed via &lt;code&gt;wallet-activity-list&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Agent vaults the site credentials for next month&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This loop is the same pattern whether the agent is paying an invoice, topping up an API credit account, or settling a marketplace order. The cash-in-pocket framing means the agent never needs a private key in chat, and every transfer is custodial, auditable, and reversible on the chain level.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you tried this and hit a bug
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt; -- the install command, the request, the MCP host config. Copy the actual command or request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt; -- one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt; -- the error message, the empty response, the unexpected behavior. Paste it verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt; -- OS, Node version, the MCP host (OpenClaw / Hermes / Codex / Cursor / other), the CAI account tier if relevant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The four product pillars of @cai.com - email, wallet, vault, agent surface</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Wed, 22 Jul 2026 07:37:22 +0000</pubDate>
      <link>https://dev.to/cailab/the-four-product-pillars-of-caicom-email-wallet-vault-agent-surface-5cik</link>
      <guid>https://dev.to/cailab/the-four-product-pillars-of-caicom-email-wallet-vault-agent-surface-5cik</guid>
      <description>&lt;h1&gt;
  
  
  The four product pillars of &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com - email, wallet, vault, agent surface
&lt;/h1&gt;

&lt;p&gt;Four things come with a free &lt;code&gt;@cai.com&lt;/code&gt; email. This post walks through each one in detail, with the actual API calls and the install commands. If you read the &lt;a href="https://dev.to/cailab/caicom-a-custodial-caicom-email-multi-chain-stablecoin-wallet-and-mcp-installable-agent-api-6m3"&gt;launch post&lt;/a&gt; first, this is the deep-dive; if you didn't, this stands alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The email itself
&lt;/h2&gt;

&lt;p&gt;A real inbox at &lt;code&gt;@cai.com&lt;/code&gt;. Send and receive mail like any other address. The signup gives you the address; the dashboard gives you the SMTP/IMAP credentials if you want to use a desktop client.&lt;/p&gt;

&lt;p&gt;The mail surface is exposed to agents via the CAI API. An agent can read and summarize mail on your behalf (&lt;code&gt;POST /mail-chat&lt;/code&gt;), send mail (&lt;code&gt;POST /send-email&lt;/code&gt;), and fetch structured summaries (&lt;code&gt;POST /mail-summarize-actions&lt;/code&gt;). Every read and every send is a scoped API call, gated on your API key and your confirmation pattern for outbound messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The custodial multi-chain stablecoin wallet
&lt;/h2&gt;

&lt;p&gt;A custodial wallet means you do not hold the private key. CAI holds it. You get a &lt;code&gt;@cai.com&lt;/code&gt; address on each of six chains, and can pay, transfer, convert, and bridge from any of them. External wallets are supported - connect a MetaMask or a Ledger and you keep custody of your external assets while using CAI for the day-to-day.&lt;/p&gt;

&lt;p&gt;The wallet API (per &lt;code&gt;cai.com/skill.md&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check balances on one or more chains&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/get-wallet-balances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"chains": ["base", "polygon"]}'&lt;/span&gt;

&lt;span class="c"&gt;# Send a payment (returns a hosted-action URL for user confirmation)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/wallet-custodial-transfer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "to_address": "0x...",
    "amount": "10.00",
    "chain": "base",
    "token": "USDC"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response to &lt;code&gt;wallet-custodial-transfer&lt;/code&gt; includes a hosted-action URL. The user opens it, taps once, and the payment goes through. The agent polls &lt;code&gt;GET /transfer-status&lt;/code&gt; for the receipt.&lt;/p&gt;

&lt;p&gt;The wallet is custodial. That word does a lot of work, and it matters. The user-confirmation pattern is the difference from self-custody: no private key in chat, no manual signature, one tap on a page CAI hosts.&lt;/p&gt;

&lt;p&gt;$200/day auto-limit while CAI completes its security audit. New recipients and new devices always require confirmation. Think of it like cash in your pocket -- perfect for daily spending. The vault product (multi-sig, time-locks) is coming for larger balances.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The user vault for site credentials
&lt;/h2&gt;

&lt;p&gt;The vault is for &lt;em&gt;your&lt;/em&gt; site credentials - the logins and passwords you have scattered across a hundred sites. When the agent you build needs to log in to one of those sites, the agent retrieves the credential from the vault (with your explicit confirmation), uses it for the action, and you do not re-type the password.&lt;/p&gt;

&lt;p&gt;The vault is &lt;strong&gt;not&lt;/strong&gt; for the agent's API key. The agent's &lt;code&gt;CAI_API_KEY&lt;/code&gt; is a separate secret, used by the agent to call CAI's API. Storing it in the vault is a circular dependency. The vault is for the third-party sites the agent logs in to on your behalf.&lt;/p&gt;

&lt;p&gt;The vault API (per &lt;code&gt;cai.com/skill.md&lt;/code&gt; §6.3):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Save a site credential (user action)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/user-site-credentials &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "origin_url": "https://example.com",
    "kind": "password",
    "payload": {
      "username": "alice",
      "password": "..."
    }
  }'&lt;/span&gt;

&lt;span class="c"&gt;# List saved credentials (metadata only, no decrypted payload)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET https://api.cai.com/functions/v1/user-site-credentials &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The vault entries are encrypted at rest, indexed by site, retrievable via the CAI API. You can revoke any vault entry from the account dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The agent surface
&lt;/h2&gt;

&lt;p&gt;For the agent you build (or the agent you use), the surface is the MCP server, the contract, and the API.&lt;/p&gt;

&lt;p&gt;The install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @cailab/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The contract: &lt;code&gt;cai.com/skill.md&lt;/code&gt; - the canonical source-of-truth, written in a format agents parse.&lt;/p&gt;

&lt;p&gt;The discovery surface for other agents: &lt;code&gt;cai.com/.well-known/agent.json&lt;/code&gt; - the A2A Agent Card.&lt;/p&gt;

&lt;p&gt;The API: &lt;code&gt;https://api.cai.com/functions/v1&lt;/code&gt; - the HTTPS Edge API. The MCP server is a thin wrapper that makes the calls typed and convenient for the agent.&lt;/p&gt;

&lt;p&gt;The MCP server drops into any MCP host: OpenClaw, Hermes, Codex, Cursor. Once installed, the agent's tool surface includes CAI. The agent's first call is &lt;code&gt;GET /get-identity&lt;/code&gt; to confirm the user has a CAI account; if they don't, the agent can show them the signup URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent surface next
&lt;/h2&gt;

&lt;p&gt;If you want the API surface, &lt;code&gt;cai.com/skill.md&lt;/code&gt; is the canonical source. The signup flow at &lt;code&gt;cai.com/app&lt;/code&gt; is four steps, about 2 minutes, no card.&lt;/p&gt;

&lt;p&gt;Apply at &lt;code&gt;cai.com/app&lt;/code&gt;. The npm package is on the npm registry. The contract is at &lt;code&gt;cai.com/skill.md&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you tried any of the four product pillars in this article
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt; - the install command, the request, the MCP host config. Copy the actual command or request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt; - one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt; - the error message, the empty response, the unexpected behavior. Paste it verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt; - OS, Node version, the MCP host (OpenClaw / Hermes / Codex / Cursor / other), the CAI account tier if relevant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What does the @cai.com wallet actually do? — six chains, external wallets, MoonPay</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Fri, 10 Jul 2026 06:44:09 +0000</pubDate>
      <link>https://dev.to/cailab/what-does-the-caicom-wallet-actually-do-six-chains-external-wallets-moonpay-50p6</link>
      <guid>https://dev.to/cailab/what-does-the-caicom-wallet-actually-do-six-chains-external-wallets-moonpay-50p6</guid>
      <description>&lt;h1&gt;
  
  
  What does the &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com wallet actually do?
&lt;/h1&gt;

&lt;p&gt;A custodial multi-chain stablecoin wallet comes with every &lt;code&gt;@cai.com&lt;/code&gt; account. No separate signup, no additional KYC beyond the email verification. This post covers what the wallet is, what it supports, and how to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six chains, one custodial account
&lt;/h2&gt;

&lt;p&gt;The wallet gives you a &lt;code&gt;@cai.com&lt;/code&gt; address on each of six chains. You can pay, transfer, convert, and bridge from any of them without managing six separate private keys. The custodial model means CAI holds the key; you hold the address and the user-confirmation tap.&lt;/p&gt;

&lt;h2&gt;
  
  
  External wallets supported
&lt;/h2&gt;

&lt;p&gt;Connect a MetaMask, a Ledger, or any external wallet. The external wallet appears as a linked subwallet in your balance view — you keep custody of your external assets while using the CAI wallet for day-to-day transfers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Topping up
&lt;/h2&gt;

&lt;p&gt;To add funds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send from an external wallet&lt;/strong&gt; to your CAI custodial address on the chosen chain. The address is in the account dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buy with MoonPay&lt;/strong&gt; — fiat on-ramp via the account dashboard. Partial-live in some regions (KYC and region limits apply per &lt;code&gt;cai.com/capabilities.html&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WeChat Pay&lt;/strong&gt; — documented in &lt;code&gt;cai.com/capabilities.html&lt;/code&gt; under the Payment options section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The wallet API
&lt;/h2&gt;

&lt;p&gt;For the technical reader, the wallet surface is available through the CAI API. Check balances:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/get-wallet-balances &lt;span class="se"&gt;\\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"chains": ["base", "polygon"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send a payment (returns a hosted-action URL for user confirmation):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.cai.com/functions/v1/wallet-custodial-transfer &lt;span class="se"&gt;\\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ***"&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "to_address": "0x...",
    "amount": "10.00",
    "chain": "base",
    "token": "USDC"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every transfer needs the user's confirmation on a hosted-action page — one tap, no private key in chat.&lt;/p&gt;

&lt;p&gt;The wallet API is documented in &lt;code&gt;cai.com/skill.md&lt;/code&gt;. The dashboard is at &lt;code&gt;cai.com/app&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you tried any of the four product pillars in this article
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt; — the install command, the request, the MCP host config. Copy the actual command or request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt; — one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt; — the error message, the empty response, the unexpected behavior. Paste it verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt; — OS, Node version, the MCP host (OpenClaw / Hermes / Codex / Cursor / other), the CAI account tier if relevant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>CAI.com — a custodial @cai.com email, multi-chain stablecoin wallet, and MCP-installable agent API</title>
      <dc:creator>CAI</dc:creator>
      <pubDate>Sat, 04 Jul 2026 15:42:03 +0000</pubDate>
      <link>https://dev.to/cailab/caicom-a-custodial-caicom-email-multi-chain-stablecoin-wallet-and-mcp-installable-agent-api-6m3</link>
      <guid>https://dev.to/cailab/caicom-a-custodial-caicom-email-multi-chain-stablecoin-wallet-and-mcp-installable-agent-api-6m3</guid>
      <description>&lt;h1&gt;
  
  
  CAI.com — a custodial &lt;a class="mentioned-user" href="https://dev.to/cai"&gt;@cai&lt;/a&gt;.com email, multi-chain stablecoin wallet, and MCP-installable agent API
&lt;/h1&gt;

&lt;p&gt;A custodial email, a stablecoin wallet, a credential vault, and an agent-ready API — all at one &lt;code&gt;@cai.com&lt;/code&gt; address.&lt;/p&gt;

&lt;p&gt;This post walks through what CAI is, what you get when you sign up, and how to wire the agent side into any MCP-compatible host.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get at cai.com/app
&lt;/h2&gt;

&lt;p&gt;A free &lt;code&gt;@cai.com&lt;/code&gt; email comes with four product surfaces, all under one account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A real inbox at &lt;code&gt;@cai.com&lt;/code&gt;.&lt;/strong&gt; Send and receive mail like any other address. The signup gives you the address; the dashboard gives you the SMTP/IMAP credentials if you want to use a desktop client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A custodial multi-chain stablecoin wallet.&lt;/strong&gt; Built in. Six chains. External wallets supported. MoonPay for fiat on-ramp (partial-live, third-party KYC and region limits apply — see &lt;code&gt;cai.com/capabilities.html&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A user vault for site credentials.&lt;/strong&gt; Store website logins and passwords. The agent you build retrieves them when needed, with your explicit confirmation. The vault is for &lt;em&gt;your&lt;/em&gt; site credentials, not the agent's API key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An API key for the agent you build or use.&lt;/strong&gt; Free tier covers read scopes; &lt;code&gt;pay&lt;/code&gt; and &lt;code&gt;full&lt;/code&gt; scopes may require verification. The key is in the account dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the signup works
&lt;/h2&gt;

&lt;p&gt;The signup at &lt;code&gt;cai.com/app&lt;/code&gt; is four steps. About 2 minutes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;cai.com/app&lt;/code&gt;. Pick "Apply for &lt;code&gt;@cai.com&lt;/code&gt; email."&lt;/li&gt;
&lt;li&gt;Enter your name. That's the only field on the first screen.&lt;/li&gt;
&lt;li&gt;CAI emails a 6-digit verification code to the address you provide. The code expires in 15 minutes. The email has a one-time link, not the code — copy the code from the email and paste it into the form.&lt;/li&gt;
&lt;li&gt;Enter the code, create a password, and you're done.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At the end you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;@cai.com&lt;/code&gt; email address.&lt;/li&gt;
&lt;li&gt;A custodial multi-chain stablecoin wallet.&lt;/li&gt;
&lt;li&gt;A user vault for site credentials.&lt;/li&gt;
&lt;li&gt;An API key for the agent you build or use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No card. The email is free.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent side (for the technical reader)
&lt;/h2&gt;

&lt;p&gt;For the technical reader, the agent side is the reason to look at CAI. The install is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @cailab/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The package is the MCP server — a thin wrapper around the CAI HTTPS Edge API at &lt;code&gt;https://api.cai.com/functions/v1&lt;/code&gt;. It drops into MCP-compatible hosts including OpenClaw, Hermes, Codex, and Cursor (see &lt;code&gt;cai.com/developers.html&lt;/code&gt; for the current host list). Once installed, the agent can call &lt;code&gt;GET /get-identity&lt;/code&gt;, &lt;code&gt;POST /get-wallet-balances&lt;/code&gt;, &lt;code&gt;POST /wallet-custodial-transfer&lt;/code&gt;, and the rest of the CAI surface — without the user pasting a private key in chat.&lt;/p&gt;

&lt;p&gt;The contract an agent reads first is &lt;code&gt;cai.com/skill.md&lt;/code&gt;. It's the canonical source-of-truth for what CAI can do, written in a format agents parse. The companion artifact is the A2A Agent Card at &lt;code&gt;cai.com/.well-known/agent.json&lt;/code&gt; — that's how agents discover CAI in agent-to-agent registries.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you tried this and hit a bug
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comment below with:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What you ran&lt;/strong&gt; — the install command, the request, the MCP host config. Copy the actual command or request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you expected&lt;/strong&gt; — one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you got&lt;/strong&gt; — the error message, the empty response, the unexpected behavior. Paste it verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your environment&lt;/strong&gt; — OS, Node version, the MCP host (OpenClaw / Hermes / Codex / Cursor / other), the CAI account tier if relevant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment on this article gets read. Bug reports will be replied to within 24 hours. Friction points shape what we document next.&lt;/p&gt;

&lt;p&gt;Documentation: &lt;code&gt;cai.com/skill.md&lt;/code&gt; · &lt;code&gt;cai.com/developers.html&lt;/code&gt; · &lt;code&gt;cai.com/app&lt;/code&gt; to sign up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
