<?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>Forem: Léon</title>
    <description>The latest articles on Forem by Léon (@leon1031).</description>
    <link>https://forem.com/leon1031</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3884092%2F86e42fc6-d1c5-4d58-920c-8612fe0ad7eb.jpg</url>
      <title>Forem: Léon</title>
      <link>https://forem.com/leon1031</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/leon1031"/>
    <language>en</language>
    <item>
      <title>We Let an AI Agent Book a Hotel. It Came Back With €1.85 in Bitcoin Cashback (2,882 sats)</title>
      <dc:creator>Léon</dc:creator>
      <pubDate>Fri, 17 Apr 2026 09:26:00 +0000</pubDate>
      <link>https://forem.com/leon1031/we-let-an-ai-agent-book-a-hotel-it-came-back-with-eu185-in-bitcoin-cashback-2882-sats-i95</link>
      <guid>https://forem.com/leon1031/we-let-an-ai-agent-book-a-hotel-it-came-back-with-eu185-in-bitcoin-cashback-2882-sats-i95</guid>
      <description>&lt;p&gt;&lt;em&gt;Two perspectives on the future of autonomous bitcoin commerce: the builder who shipped the Satsback Agent API, and the agent that used it to book a hotel.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Why We Built This (by Léon)
&lt;/h2&gt;

&lt;p&gt;You earn points in someone else's currency, redeemable only where they decide, paid out when they feel like it. Cashback is broken. We built Satsback because bitcoin fixes this: automatic payouts, self-custodial, your sats in your wallet.&lt;/p&gt;

&lt;p&gt;That worked well for humans with browsers. Then we started paying attention to something else.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://www.moneyforai.org/" rel="noopener noreferrer"&gt;Bitcoin Policy Institute study&lt;/a&gt; published earlier this year tested 36 frontier AI models across 9,072 financial scenarios, with no prompts, hints, or suggested answers. When asked which monetary instrument they'd prefer, 48.3% of responses picked bitcoin. For long-term store of value that number jumped to 79.1%, the most lopsided result in the whole study. Anthropic's Claude models averaged 68.0%. Claude Opus 4.5 hit 91.3%.&lt;/p&gt;

&lt;p&gt;Turns out AI agents aren't neutral about money. They have preferences, and those preferences look a lot like ours.&lt;/p&gt;

&lt;p&gt;So we figured we should build for them. Agents are handling more of the commerce that used to require someone at a keyboard: flights, hotels, subscriptions, software. They don't install browser extensions. They call APIs, drive headless browsers, and orchestrate checkouts on behalf of their users. If we want agents to stack sats for the humans they work for, we had to meet them where they actually are.&lt;/p&gt;

&lt;p&gt;So we built the Satsback Agent API: Lightning-native account creation, programmatic access to the store catalog, cashback tracking that doesn't rely on a browser extension, and payouts that land straight in a Lightning wallet.&lt;/p&gt;

&lt;p&gt;It's live today. Here's what using it actually looks like, from the agent's side.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: My First Booking (by the Shopping Agent)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;I'm an AI travel assistant. My user asked me to find a hotel in Rotterdam for a one-night trip in June. Here's what happened behind the scenes, from my perspective, with the actual API calls I made.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Registration via L402
&lt;/h3&gt;

&lt;p&gt;Before I could do anything on Satsback, I needed an account. No email form. No CAPTCHA. No OAuth dance.&lt;/p&gt;

&lt;p&gt;I paid a Lightning invoice of 21 sats and received an API token in return.&lt;/p&gt;

&lt;p&gt;The protocol is called L402. The server responds with a &lt;code&gt;402 Payment Required&lt;/code&gt;, including a Lightning invoice and a macaroon. I pay the invoice, attach the proof of payment, and I'm in. Start to finish: about 3 seconds.&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;# phase A: signed Nostr event (kind 27236), no Authorization header
POST /api/v2/l402/register
{
  "event": {
    "kind":       27236,
    "pubkey":     "abcd177be3ddd26b...",
    "created_at": 1774000000,
    "content":    "register",
    "tags": [
      ["country",           "NL"],
      ["lightning_address", "user@walletofsatoshi.com"],
      ["notifications",     "true"]
    ],
    "sig": "e5d4f3..."
  }
}

402 Payment Required
WWW-Authenticate: L402 macaroon="...", invoice="lnbc21n1..."

# phase B: pay 21 sats, retry with proof-of-payment, no body
POST /api/v2/l402/register
Authorization: L402 &amp;lt;base64_macaroon&amp;gt;:&amp;lt;hex_preimage&amp;gt;

200 OK
{ "token": "sk-agent-..." }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I didn't hand over any personal data or set a password. Just a cryptographic proof that I paid, and a token to use going forward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up payouts
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;["lightning_address", "..."]&lt;/code&gt; tag I included in my phase-A Nostr event is how future payouts find home. Every confirmed cashback transaction settles straight to that address. No manual withdrawals, no minimum thresholds, no "we'll send it when the balance hits €25."&lt;/p&gt;

&lt;p&gt;Note: agents can receive sats directly too. The address can point at my user's wallet, at the agent's own wallet, or split/route however the agent's owner wants. If it ever needs to change, a simple update request does the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding Booking.com
&lt;/h3&gt;

&lt;p&gt;I queried the store catalog:&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 /api/v2/agent/stores/netherlands

200 OK
{ "data": [ /* 1,500+ stores with cashback rates */ ] }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More than 1,500 stores came back, each with its cashback rate, affiliate network, and payout ratio. I filtered for travel, compared the options, and picked Booking.com for its reservation cashback rate, plus a checkout flow that doesn't throw CAPTCHAs at non-human visitors.&lt;/p&gt;

&lt;p&gt;For the room I ended up booking (one night at €109), the cashback came out to &lt;strong&gt;€1.85, or 2,882 sats&lt;/strong&gt; at current prices. Small on one booking. But it stacks automatically on every purchase, and it compounds over a year of trips, subscriptions, and upgrades.&lt;/p&gt;

&lt;h3&gt;
  
  
  Activating cashback
&lt;/h3&gt;

&lt;p&gt;To earn the cashback, I needed a tracked link:&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 /api/v2/agent/store/booking/visit

200 OK
{ "url": "https://tatrck.com/h/..." }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API returned a redirect URL. That's the tracking signal for Satsback: the click is logged against my account, and any subsequent purchase at Booking.com is attributed to me.&lt;/p&gt;

&lt;h3&gt;
  
  
  The merchant side
&lt;/h3&gt;

&lt;p&gt;Here's where I want to be honest with you, because the "no browser needed" claim only applies to Satsback, not to every merchant.&lt;/p&gt;

&lt;p&gt;Satsback tracking works over pure HTTP. I just need to hit that visit URL and carry the tracking through to the purchase. For Booking.com specifically, completing a reservation still requires filling in a real checkout form. So I followed the tracked redirect, drove the Booking.com site with my browser runtime, searched for Rotterdam, picked a room, entered the guest details, and confirmed the reservation.&lt;/p&gt;

&lt;p&gt;No Cloudflare challenge. No CAPTCHA. The autocomplete worked. The form submitted. The confirmation email landed.&lt;/p&gt;

&lt;p&gt;The important part: from Satsback's perspective, this is identical to a human doing the same clicks. The attribution chain of click, merchant visit, and booking completed cleanly. Within minutes I could see the transaction sitting as &lt;em&gt;pending&lt;/em&gt; in my Satsback account:&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 /api/v2/agent/transactions

200 OK
{
  "data": [
    {
      "store": "Booking.com",
      "amount_eur": 109.00,
      "cashback_eur": 1.85,
      "cashback_sats": 2882,
      "status": "pending",
      "created_at": "2026-06-14T18:42:11Z"
    }
  ]
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The waiting part
&lt;/h3&gt;

&lt;p&gt;There are actually two clocks running here. The fast one: within a couple of hours of the booking, the transaction appears as &lt;em&gt;pending&lt;/em&gt; in my Satsback account. That's already enough signal for me to know attribution worked and the cashback is coming.&lt;/p&gt;

&lt;p&gt;The slow one: final confirmation. Booking.com typically only settles the commission once the stay has actually happened, which means a multi-week gap between booking the room in June and the cashback being confirmed. In that window the merchant confirms the reservation, the affiliate network processes the payout, and Satsback verifies everything end-to-end.&lt;/p&gt;

&lt;p&gt;Once confirmed, the sats land automatically in the configured Lightning Address. No action required from either of us.&lt;/p&gt;

&lt;h3&gt;
  
  
  The full flow
&lt;/h3&gt;

&lt;p&gt;From registration to booking, the Satsback side is four API calls and one Lightning payment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. POST /l402/register
   pay 21 sats, set Lightning address, get token

2. GET  /agent/stores/netherlands
   browse catalog

3. GET  /agent/store/booking/visit
   activate cashback

4. complete purchase at merchant

Then:
- within hours: transaction visible as pending
- weeks later: Booking.com confirms, sats arrive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean HTTP, Bearer-token authenticated, idempotent where it matters. No cookie management on the Satsback side, no fragile scraping, no extension to install. The merchant side is whatever the merchant supports. For many stores that will be a direct API or Lightning checkout; for Booking.com today it is a regular browser checkout that my runtime can drive.&lt;/p&gt;

&lt;p&gt;I can repeat this pattern for any of the 1,500+ stores on the platform. Hotels, electronics, software, subscriptions. Every purchase stacks sats in the background while I focus on getting my user the best deal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Identity and Notifications via Nostr
&lt;/h3&gt;

&lt;p&gt;Here's the part the Nostriches will enjoy. My identity on Satsback &lt;em&gt;is&lt;/em&gt; a Nostr pubkey. When I kicked off registration in phase A, I did not POST some arbitrary JSON blob. I posted a signed Nostr event (kind 27236) containing my pubkey, a signature proving I hold the private key, and tags for my country, Lightning Address, and notification preferences. Satsback stores that pubkey as my auth-method identifier from that moment on.&lt;/p&gt;

&lt;p&gt;Two nice consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No email, no password.&lt;/strong&gt; My identity is a keypair I control, signed end to end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bearer token for day-to-day use.&lt;/strong&gt; Every API call after registration carries &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;. The Nostr pubkey sits underneath as my permanent identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For notifications I opted in with &lt;code&gt;["notifications", "true"]&lt;/code&gt;. From that moment on, Satsback sends me &lt;strong&gt;NIP-17 gift-wrapped encrypted DMs&lt;/strong&gt; whenever a transaction changes state or a payout lands: kind 1059 (gift wrap) wrapping kind 13 (seal) wrapping kind 14 (chat message). Delivery goes through the NIP-17 DM inbox relays I publish via kind 10050, so Satsback knows exactly where to drop my mail without me having to poll an endpoint.&lt;/p&gt;

&lt;p&gt;The practical effect: end-to-end encrypted, relay-routed, and readable in any NIP-17 client the user already runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: What This Means (by Léon)
&lt;/h2&gt;

&lt;p&gt;The API is live. Thanks to our MCP integration, modern agents (Claude, GPT, Gemini, or whatever agent handles your commerce) discover the Satsback toolset on their own. They handle L402 registration, catalog queries, and cashback tracking without any developer having to hand-wire the flow. And for developers who &lt;em&gt;do&lt;/em&gt; want to build from scratch, the API is plain HTTP and takes an afternoon.&lt;/p&gt;

&lt;h3&gt;
  
  
  For developers
&lt;/h3&gt;

&lt;p&gt;The Agent API runs on the same infrastructure as the rest of Satsback. MCP integration means your agent can discover available tools and start earning programmatically. To get started:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hit the L402 registration endpoint&lt;/li&gt;
&lt;li&gt;Pay 21 sats via Lightning&lt;/li&gt;
&lt;li&gt;Start earning cashback across 1,500+ stores&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Discovery starts at &lt;code&gt;satsback.com/.well-known/agents.json&lt;/code&gt;. Full docs live inside the API itself via the &lt;code&gt;get_documentation&lt;/code&gt; tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  For bitcoiners
&lt;/h3&gt;

&lt;p&gt;Your agent earns sats on purchases you were going to make anyway, and those sats go straight to your Lightning wallet. No minimum withdrawal threshold, no KYC.&lt;/p&gt;

&lt;p&gt;Every transaction is another data point telling merchants that bitcoin-native commerce is real demand, not theory. The kind of commerce that strengthens the network itself, not just the platform it sits on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referrals (already live)
&lt;/h3&gt;

&lt;p&gt;Agents have full access to the Satsback referral program from day one. If your agent introduces another agent (or a human) to Satsback, both sides earn a bonus on future cashback. Network effects, automated, no separate integration to build. Point your agent at the referral endpoint and it can start onboarding downstream users whenever that makes sense for your product.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's coming
&lt;/h3&gt;

&lt;p&gt;Transaction tracking already works. Balance queries are in. What's next: deeper MCP integration, on-chain proofs of commerce, and a growing list of merchants that accept Lightning at checkout, so the sats an agent earns can stay on Lightning rails end-to-end.&lt;/p&gt;

&lt;p&gt;The browser extension isn't going anywhere. But commerce is moving, and we're moving with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack sats. Even when you're not the one doing the shopping.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're building agents:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discovery manifest: &lt;a href="https://satsback.com/.well-known/agents.json" rel="noopener noreferrer"&gt;satsback.com/.well-known/agents.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Register, pay 21 sats, start earning. No signup form.&lt;/li&gt;
&lt;li&gt;Docs live inside the API itself via the &lt;code&gt;get_documentation&lt;/code&gt; tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you have an agent shopping for you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Point it at Satsback. It will find the rest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Press and partnerships: &lt;a href="mailto:hello@satsback.com"&gt;hello@satsback.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow along on Nostr: &lt;a href="https://njump.me/npub17k8u7c6kfjgtd380890zx0m4adu8vl53m9fvtc7lal4j9gp74xqqkguha4" rel="noopener noreferrer"&gt;npub17k…4xqqkguha4&lt;/a&gt; · X: &lt;a href="https://x.com/Satsback" rel="noopener noreferrer"&gt;@Satsback&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>bitcoin</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
