Wallet & Credits
Wallet & Credits
Philosophy
Mu is a tool, not a destination. Like Google Search in 2000 — you arrive with intent, get what you need, and leave.
Credits are a straightforward way to pay for what you use. No dark patterns, no pressure to upgrade, no “unlimited” tiers that incentivize us to maximize your engagement.
- Free tier: 10 AI queries/day - enough for casual utility use
- Pay-as-you-go: Top up with a card or pay per-request with crypto
- Self-host: Run your own instance for free, forever
We charge because LLMs and APIs cost money. Here’s our actual cost breakdown — we’re not extracting margin, just covering infrastructure.
How It Works
Credits
- 1 credit = £0.01 GBP (1 penny)
- Credits stored as integers to avoid floating-point issues
- Top up via card payment (Stripe) or pay per-request with crypto (x402)
- Credits never expire
Daily Free Quota
Every registered user gets 10 free AI queries per day:
- Resets at midnight UTC
- Covers news search, video search, and chat AI queries
- No payment required
This should be enough if you’re using Mu as a utility. If you need more, pay-as-you-go.
Credit Costs
| Feature | Cost | Why |
|---|---|---|
| News Search | 1 credit (1p) | Indexed search |
| News Summary | 1 credit (1p) | AI-generated summary |
| Video Search | 2 credits (2p) | YouTube API cost |
| Video Watch | Free | No value added over YouTube |
| Chat AI Query | 3 credits (3p) | LLM inference cost |
| Chat Room | 1 credit (1p) | Room creation |
| Places Search | 5 credits (5p) | Google Places API cost |
| Places Nearby | 2 credits (2p) | Google Places API cost |
| External Email | 4 credits (4p) | SMTP delivery cost |
| Weather Forecast | 1 credit (1p) | Weather API cost |
| Weather Pollen | 1 credit (1p) | Pollen data add-on |
Note: Internal messages (user-to-user within Mu) are free. Only external email (to addresses outside Mu) costs credits.
Who Pays What
| User Type | Daily Free | Credits | Notes |
|---|---|---|---|
| Guest | 0 | N/A | Must register |
| Registered | 10 queries | Pay-as-you-go | When free quota exceeded |
| Admin | Unlimited | Not needed | Site administrators |
Why No “Unlimited” Tier?
Unlimited tiers create misaligned incentives. If you pay a flat fee for unlimited usage, we’re incentivized to make you use Mu more to feel you’re getting value. That’s the seed of engagement optimization.
Pay-as-you-go keeps us honest: we want to build efficient tools that solve your problem quickly, not sticky products that maximize your screen time.
If you want truly unlimited and free — self-host. The code is open source.
Card Deposits (Stripe)
When Stripe is configured (STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY), users can top up with a credit or debit card:
- Go to
/wallet/topup - Enter any amount in whole pounds (e.g. £10), or use a quick-select preset (£5, £10, £25, £50)
- Complete payment via the Stripe Checkout page
- Credits are added automatically via the Stripe webhook (
/wallet/stripe/webhook)
Rate: 1 credit = 1p — flat, no bonuses or tiers.
Configure a webhook in the Stripe Dashboard pointing to https://your-domain.com/wallet/stripe/webhook and set STRIPE_WEBHOOK_SECRET to the signing secret. The webhook listens for checkout.session.completed events.
Crypto Payments (x402)
The x402 protocol enables account-free, per-request payments with stablecoins. This is designed for AI agents and programmatic clients that want to pay for API access without creating a Mu account.
How It Works
- Client sends an API request without auth
- Mu returns
HTTP 402 Payment Requiredwith anX-PAYMENT-REQUIREDheader containing payment requirements (amount, network, asset, wallet address) - Client signs a payment on-chain (USDC on Base by default)
- Client retries the request with the
X-PAYMENTheader containing the payment proof - Mu verifies the payment via a facilitator, settles on-chain, and serves the response
Configuration
Set X402_PAY_TO to enable:
# Required: your wallet address to receive payments
X402_PAY_TO="0xYourWalletAddress"
# Optional (defaults shown)
X402_FACILITATOR_URL="https://x402.org/facilitator"
X402_NETWORK="eip155:8453" # Base mainnet
X402_ASSET="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" # USDC on Base
Pricing
Credit costs are converted to USD at 1 credit = $0.01. For example, a web search (5 credits) costs $0.05 per request via x402.
x402 vs Stripe
| Stripe (Card) | x402 (Crypto) | |
|---|---|---|
| Account required | Yes | No |
| Payment model | Pre-pay credits | Pay per request |
| Settlement | Instant (webhook) | On-chain (~seconds) |
| Currency | GBP | USDC |
| Best for | Human users | AI agents, programmatic clients |
Transfers
Users can transfer credits to other users on the network:
- Go to
/wallet/transfer - Enter the recipient’s username and amount
- Credits are transferred instantly
Transfers are also available via the MCP wallet_transfer tool and the REST API.
Limits:
- Minimum: 1 credit
- Maximum: 50,000 credits (£500) per transfer
- Cannot transfer to yourself
- Sender must have sufficient balance
Transaction types:
- Transfers appear in both parties’ transaction history
- Sender sees a negative “transfer” transaction with the recipient’s ID
- Receiver sees a positive “transfer” transaction with the sender’s ID
- Transfers are instant and non-reversible
Data Model
Wallet
type Wallet struct {
UserID string `json:"user_id"`
Balance int `json:"balance"` // Credits (pennies)
Currency string `json:"currency"` // "GBP"
UpdatedAt time.Time `json:"updated_at"`
}
Transaction
type Transaction struct {
ID string `json:"id"`
UserID string `json:"user_id"`
Type string `json:"type"` // "topup", "spend", "refund"
Amount int `json:"amount"` // Positive for topup, negative for spend
Balance int `json:"balance"` // Balance after transaction
Operation string `json:"operation"` // e.g., "news_search", "topup"
Metadata map[string]interface{} `json:"metadata"`
CreatedAt time.Time `json:"created_at"`
}
Daily Usage
type DailyUsage struct {
UserID string `json:"user_id"`
Date string `json:"date"` // "2006-01-02"
Used int `json:"used"` // Free quota used today
}
API Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /wallet |
View balance and transaction history |
| GET | /wallet/topup |
Show deposit address and instructions |
| GET | /wallet/transfer |
Transfer credits form |
| POST | /wallet/transfer |
Transfer credits to another user |
| POST | /wallet/stripe/checkout |
Create a Stripe checkout session |
| GET | /wallet/stripe/success |
Success page after Stripe payment |
| POST | /wallet/stripe/webhook |
Stripe webhook for payment confirmation |
Environment Variables
# Stripe card payments (optional)
STRIPE_SECRET_KEY="sk_live_..."
STRIPE_PUBLISHABLE_KEY="pk_live_..."
STRIPE_WEBHOOK_SECRET="whsec_..." # For verifying Stripe webhook events
# x402 crypto payments (optional - set PAY_TO to enable)
X402_PAY_TO="0xYourWalletAddress"
X402_FACILITATOR_URL="https://x402.org/facilitator"
X402_NETWORK="eip155:8453"
X402_ASSET="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
# Quota (optional - these are defaults)
FREE_DAILY_QUOTA="10"
CREDIT_COST_NEWS="1"
CREDIT_COST_NEWS_SUMMARY="1"
CREDIT_COST_VIDEO="2"
CREDIT_COST_VIDEO_WATCH="0"
CREDIT_COST_CHAT="3"
CREDIT_COST_EMAIL="4"
CREDIT_COST_PLACES_SEARCH="5"
CREDIT_COST_PLACES_NEARBY="2"
CREDIT_COST_WEATHER="1"
CREDIT_COST_WEATHER_POLLEN="1"
Implementation
Quota Check Flow
- User initiates search/chat
- Check for x402 payment header → verify and settle on-chain (no account needed)
- Check if admin → allow (no charge)
- Check daily free quota → allow if available, decrement
- Check wallet balance → allow if sufficient, deduct credits
- Otherwise → return 402 with payment requirements (if x402 enabled) or show “quota exceeded”
Security
- Full transaction audit trail
- Never allow negative balance








