Vol. 01 · No. 02 · Live

Payment link checkout, no merchant stack.

An Anyway payment link is a hosted checkout for one product or service. You create it once in app.anyway.sh (Business profile → Payment links), set the price, and share the URL. The buyer pays in USDC or fiat; you never build a cart, a card form, or a webhook receiver to get paid.

Live product

Buy the real thing.

This is a real Anyway payment link, not a sandbox. Opening it launches the hosted checkout in a new tab — you'll see the price, the accepted rails and the settlement address before anything is charged.

https://app.anyway.sh/pay/PL26LCHP1LHQ8W24

Two ways to pay the same link.

Mode 1 · Human

Connect Wallet

The checkout opens a Privy sheet — MetaMask, Coinbase Wallet, 1inch or any other. Enter the amount, pay in USDC on Base. Your wallet needs two things: USDC on Base for the payment and a little ETH on Base for gas. Verified: paying from MetaMask funded that way settles and the receipt email arrives immediately.

An Anyway Agent Wallet connected here is refused — "RPC request denied due to policy violation" — because its spending policy only authorises x402 settlement, not a browser transfer. Use a personal wallet for this mode.

Mode 2 · Agent / automation

One GET, then settle

The "Pay by Agent or Automation" sheet hands your agent a single endpoint. It returns the recipient, the USDC contract, the network and a confirm URL — everything a machine needs to pay without a browser. Two routes from there: a plain ERC-20 transfer plus a confirm POST, or x402 for a gasless, instant, single-endpoint settlement — the same primitive the SuperAPI explorer uses.

Live · GET /v1/pay/agent/PL26LCHP1LHQ8W24

What the agent receives.

Fetching live instructions…

Live · POST /v1/pay/x402/PL26LCHP1LHQ8W24

Let the agent pay it.

No browser wallet, no human signature. The Agent Wallet held server-side takes the 402 challenge, signs an EIP-3009 authorization and settles 0.00001 USDC on Base. Hard-capped at that amount per press, with a session budget — this is a real payment, not a simulation.

Pay it from code.

Route A — a normal ERC-20 transfer on Base, then confirm the hash so the order is registered against your email. Needs ETH on Base for gas:

const info = await fetch(
  "https://app-prod.anyway.sh/v1/pay/agent/PL26LCHP1LHQ8W24",
).then((r) => r.json());

const { recipient, usdcContract } = info.data;

const txHash = await walletClient.writeContract({
  address: usdcContract,          // USDC on Base
  abi: erc20Abi,
  functionName: "transfer",
  args: [recipient, 100n],        // 0.0001 USDC (6 decimals)
});

// Confirm immediately, then again after ~12 confirmations.
await fetch("https://app-prod.anyway.sh/v1/pay/PL26LCHP1LHQ8W24/confirm", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ txHash, email: "payer@example.com", note: "Krump Workshop" }),
});

Route B — x402. POST with no signature to get the 402 challenge, sign the EIP-3009 authorisation, POST again. No ETH needed, settled in one round trip. This is the same helper the SuperAPI demo signs with, in src/lib/anyway-wallet.server.ts:

// src/lib/paylink.functions.ts
import { createServerFn } from "@tanstack/react-start";

export const payLink = createServerFn({ method: "POST" }).handler(async () => {
  const { payX402 } = await import("./anyway-wallet.server");
  return payX402({
    url: "https://app-prod.anyway.sh/v1/pay/x402/PL26LCHP1LHQ8W24",
    method: "POST",
    body: JSON.stringify({ email: "payer@example.com" }),
    maxAtomic: 10_000, // 0.01 USDC ceiling (atomic units)
  });
});

Wire it into your own build.

The checkout itself is one outbound link — no SDK, no client secret. Keep the URL as a constant (or an env value) and render a button:

const PAY_LINK = "https://app.anyway.sh/pay/PL26LCHP1LHQ8W24";

<a href={PAY_LINK} target="_blank" rel="noreferrer">
  Buy now
</a>

To show order status inside your app, read it server-side. The business key stays on the server — never in the browser, never behind a VITE_ prefix:

// src/lib/orders.functions.ts
import { createServerFn } from "@tanstack/react-start";

export const listOrders = createServerFn({ method: "GET" }).handler(async () => {
  const res = await fetch("https://api.anyway.sh/v1/orders", {
    headers: { Authorization: `Bearer ${process.env["ANYWAY_API_KEY"]}` },
  });
  return res.json();
});
SuperAPI demoBrowse 1,000 ideas