在智能体大模型时代把无头电商准备好
买家正在变成智能体。要让大语言模型在没有人介入时读得懂、签得了名、付得了款,需要什么,以及 Hanzo 今天为此交付了什么。

本页内容
无头电商把店面和引擎拆开,于是任何前端都能通过同一个 API 卖东西。那个前端始终是给人看的:一个网站、一个应用,或一台自助机。
下一个前端不看。它读。买家正在变成智能体:一个带着目标、预算和工具循环的程序,被派去找一套方案、一块 GPU,或一个支付 API。它向自己读得懂、并且不用找人帮忙就能付款的那一方购买。如果你的生意还要人来读页面、关掉 cookie 提示、打开确认邮件或输入卡号,智能体就会拿走下一条结果。
这就是论点。一家企业必须让大语言模型在没有人介入的情况下读得懂,并且能独自把交易做完。 读得懂,是说智能体能知道你卖什么、多少钱、怎样开始。能做交易,是说它能通过 API 独自开始、付款并拿到那样东西。
下面按点说明这需要什么,以及 Hanzo 今天为此交付了什么。下面每个地址都无需账号即可访问,你可以自己核对每一条说法。
把每一页都做成 Markdown
智能体为读到的每一个 token 付费。在 hanzo.ai 上,给页面地址加上 .md,就能拿到 Markdown 形式的页面:hanzo.ai/pricing.md、hanzo.ai/about.md。每个页面都在头部用 <link rel="alternate" type="text/markdown"> 点明自己的孪生页,智能体不必猜测。
10 月 26 日,我用两种方式抓取了我们的智能体页面:HTML 为 528,810 字节,Markdown 为 17,465 字节。然后我从站点地图里每隔十二个 URL 取一个,829 个里取了 70 个,并请求它的孪生页。70 个全部以 200 返回,类型为 text/markdown。
发布一个智能体能从那里出发的索引
从未听说过你的智能体,需要一个通向各处的地址。我们发布了三个。
-
hanzo.ai/llms.txt 是站点的纯文本地图。它说明 Hanzo 是什么,接着在 “For agents” 一节给出取得密钥的确切步骤,然后逐行列出页面,一页一行。docs.hanzo.ai/llms.txt 对文档做同样的事。
-
api.hanzo.ai/v1 列出 API 提供的每一种能力,不需要密钥;api.hanzo.ai/v1/openapi.json 则包含每一个操作及其模式。就销售而言,索引里有一项
commerce能力:结账、订阅、发票、支付 webhook,以及店面目录。 -
hanzo.ai/.well-known/api-catalog 是客户端首先查看的标准位置(RFC 9727)。它指向 OpenAPI 文档、文档和状态页。
有意迎接爬虫
robots.txt 是任何爬虫都会先要的文件。我们的 逐一写出十二个 AI 爬虫的名字,其中有 GPTBot、ClaudeBot、Claude-User、PerplexityBot 和 Google-Extended,并允许它们。它们得到的例外与其他人相同:登录、账户、支付,以及 API 路径。
屏蔽 AI 爬虫是正当的选择。因为默认配置这么写就屏蔽,那根本不算选择。
让价格成为一条数据
智能体会比较。写在图片里的价格,或藏在“联系我们”按钮后面的价格,没法比较。api.hanzo.ai/v1/billing/plans 不需要密钥,返回 JSON:Free 为 0,Pro 为每月 2000,Team 为每席 2500,每种方案的限额写在旁边。金额以美分为单位。
让钱包自己注册
智能体没有收件箱,没有电话,也没有卡。它有一对密钥。于是 hanzo.id 用钱包登录:为钱包地址要一个一次性 nonce,对它描述的消息签名,提交签名,再把返回的代码换成令牌。
Hanzo 没见过的钱包会得到自己的账户和自己的组织,钱包担任管理员,方案为 Free。令牌有效期为七天。没有人去打开邮件,也没有人去批准设备。
一次调用拿到密钥,并留一小份额度试用
凭这个令牌,POST /v1/account/keys 会返回一把比令牌更长寿的 sk-live- 密钥。请保存;文档写明它只显示一次。
Free 方案在 zen-free 上每天 50 次请求,不需要卡,每次响应都在 x-ratelimit-remaining 里写明剩余次数。我的第一次调用返回 200,还剩 49 次。
没有人也能收款:通过 API 收稳定币
POST /v1/billing/crypto/deposit 接收一条链、一种代币和一个金额,并返回一个有效期为 24 小时的充值地址。GET /v1/billing/crypto/options 列出它接受的内容:链为 Base、Ethereum 和 Solana,代币为 USDC 和 USDT。
我停在地址上,没有打钱。链上确认后余额入账,这是我们文档里的说法,不是我跑过的结果。方案和订阅仍是浏览器里的银行卡结账。智能体需要我们提供的是余额,而余额有 API。
整条流程,写在一个文件里
这就是 hanzo.ai/agents#headless,作了删节。每一行都与那个页面印出的一致;我略去了第二条文件头注释、选项调用,以及打印密钥前缀的那一行。需要 Node 22.18 或更新版本,以及 npm i viem,然后运行 node headless.mts。我用一个新钱包在生产环境跑了这段:得到令牌、密钥、一次免费调用,以及一个 USDC 充值地址。
// No human required: sign in with a wallet, get a key, call the API, top up in USDC.
// npm i viem · node headless.mts (Node 22.18+; set HANZO_WALLET_KEY to use your own wallet)
import { createHash, randomBytes } from 'node:crypto'
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
const ID = 'https://hanzo.id'
const API = 'https://api.hanzo.ai'
const CLIENT = 'hanzo-ai'
const REDIRECT = 'http://localhost:3000/callback'
const account = privateKeyToAccount((process.env.HANZO_WALLET_KEY as `0x${string}`) ?? generatePrivateKey())
const json = async (r: Response) => {
const body = await r.json()
if (!r.ok || body?.status === 'error') throw new Error(`${r.url} ${r.status} ${JSON.stringify(body)}`)
return body
}
// 1. A one-time challenge for this wallet.
const { data: c } = await json(await fetch(`${ID}/v1/iam/web3/nonce?chain=evm&address=${account.address}`))
// 2. The CAIP-122 message the challenge describes, signed with EIP-191 personal_sign.
const message = [
`${c.domain} wants you to sign in with your Ethereum account:`,
account.address,
'',
...(c.statement ? [c.statement, ''] : []),
`URI: ${c.uri}`,
`Version: ${c.version}`,
`Nonce: ${c.nonce}`,
`Issued At: ${c.issuedAt}`,
...(c.expirationTime ? [`Expiration Time: ${c.expirationTime}`] : []),
].join('\n')
const signature = await account.signMessage({ message })
// 3. Verify: a first-seen wallet gets an account and an organization of its own.
const verifier = randomBytes(32).toString('base64url')
const challenge = createHash('sha256').update(verifier).digest('base64url')
const { data: code } = await json(
await fetch(`${ID}/v1/iam/web3/verify`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientId: CLIENT, chain: 'evm', scheme: 'secp256k1-eip191', address: account.address, message, signature,
type: 'code', redirectUri: REDIRECT, scope: 'openid profile email', codeChallenge: challenge, codeChallengeMethod: 'S256',
}),
}),
)
// 4. The authorization code for a token.
const token = await json(
await fetch(`${ID}/v1/iam/oauth/token`, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({ grant_type: 'authorization_code', client_id: CLIENT, code, code_verifier: verifier, redirect_uri: REDIRECT }),
}),
)
const bearer = { Authorization: `Bearer ${token.access_token}`, 'Content-Type': 'application/json' }
// 5. A key that outlives the token. Shown once: keep it in your secret store.
const minted = await json(await fetch(`${API}/v1/account/keys`, { method: 'POST', headers: bearer, body: JSON.stringify({ name: 'agent', type: 'secret' }) }))
const key = { Authorization: `Bearer ${minted.key}`, 'Content-Type': 'application/json' }
// 6. A first call, free.
const chat = await fetch(`${API}/v1/chat/completions`, {
method: 'POST', headers: key,
body: JSON.stringify({ model: 'zen-free', messages: [{ role: 'user', content: 'Reply with the single word: ready' }] }),
})
console.log('chat', chat.status, chat.headers.get('x-hanzo-served'), 'free left today:', chat.headers.get('x-ratelimit-remaining'))
console.log((await chat.json()).choices?.[0]?.message?.content)
// 7. Top up in USDC: ask for a deposit address, then send to exactly that address.
console.log(await json(await fetch(`${API}/v1/billing/crypto/deposit`, { method: 'POST', headers: key, body: JSON.stringify({ chain: 'base', token: 'usdc', amountCents: 500 }) })))
x402 会来,但还没到
充值之外,适合智能体的形态是按请求付费。服务器带着价格回答 402 Payment Required,客户端付款后重试。那就是 x402。它还没有在我们的 API 上线:还没有任何 Hanzo 端点用这种方式报价,所以我不会声称已经支持。在那之前,通过 API 充值的余额,就是智能体向我们付款的方式。
为什么爬虫零错误很重要
这些失败都不会大声响。智能体顺着站点地图的链接走进 404,不会去提工单。它直接拿走下一条结果。对待爬虫错误,应当像商店对待坏掉的结账一样。
我用 ClaudeBot 的 user-agent 字符串抓了同样的 70 个抽样页面,又用 Googlebot 的再抓一次。每一次都返回 200。这是抽样,不是保证;user-agent 字符串也不是爬虫自己的地址,所以我没法向你展示真实爬虫看到的内容。在你自己的站点上做同样的事:用你邀请的智能体去抓站点地图,数一数哪些响应不是 200。
我们以前来过这里
我在 2014 年创办这家公司,当时叫 Crowdstart;2016 年我们把它改名为 Hanzo。第一个客户 SKULLY 在 Indiegogo 上大约 45 小时筹集了 $1 million,TechCrunch 称之为Indiegogo 上最快募满的活动。在我看来,Hanzo 从一开始就是以 AI 为原生的商业:先是我们自己的分析,然后是从平台上那些公司的数据里学习的模型。2017 年我们加入了 Techstars(那年六月的文章),当时我们说自己在做的是智能商业。
2020 年,Damon Motorcycles 在 CES 发布,活动由 Hanzo 运营。30 天里,平台以 $15,532 的广告花费卖出了 $8.4M 的摩托车,回报为 541:1。受众每 12 小时根据我们的客户数据重建一次,AI 撰写的广告组在 36 小时内于 Facebook 上被评为 Above Average。其余见案例。
那是销售一侧的机器,找到会买的受众,并写出广告。购买一侧是下一步。同一条循环即将从另一头跑起来,你的生意要么被机器读懂并付款,要么被机器跳过。
把你的智能体指向 hanzo.ai/agents。
继续阅读

Hanzo Payments: Unified Payment Processing for Global Commerce
Launching Hanzo Payments — unified payment processing with intelligent routing, fraud detection, and multi-currency support.

Introducing the Hanzo Platform
Crowdstart evolves into Hanzo: a complete commerce platform for the modern era.

路由器就是注册表
Hanzo Cloud 没有签入的 OpenAPI 文件。活的路由表才是源头,以三种方式投影,任一投影漂移,双射测试就让构建失败。963 条路径上的 1,362 个操作,在请求时按进程生成。
