Tối ưu thương mại headless trong kỷ nguyên LLM dạng agent
Người mua đang trở thành agent. Cần những gì để một LLM đọc được, ký được và thanh toán được khi không có người trong vòng lặp, và Hanzo đang giao gì cho việc đó hôm nay.

Trong trang này
Thương mại headless tách mặt tiền khỏi bộ máy, để bất kỳ giao diện nào cũng bán được qua một API. Giao diện ấy luôn là thứ một người nhìn vào: một trang web, một ứng dụng, một ki-ốt.
Giao diện kế tiếp không nhìn. Nó đọc. Người mua đang trở thành agent: một chương trình có mục tiêu, có ngân sách và một vòng công cụ, được cử đi tìm một gói, một GPU hoặc một API thanh toán. Nó mua từ bên nào nó hiểu được và trả được mà không phải nhờ người giúp. Nếu việc kinh doanh của bạn cần một người đọc trang, tắt biểu ngữ cookie, mở email xác nhận hoặc gõ số thẻ, agent lấy kết quả kế tiếp.
Đó là luận điểm. Một doanh nghiệp phải để LLM đọc được và giao dịch được mà không có người trong vòng lặp. Đọc được nghĩa là agent biết bạn bán gì, giá bao nhiêu và bắt đầu thế nào. Giao dịch được nghĩa là nó tự bắt đầu, trả tiền và nhận được thứ đó qua một API.
Đây là những gì việc đó đòi hỏi, từng điểm một, cùng những gì Hanzo giao hôm nay. Mọi địa chỉ bên dưới trả lời mà không cần tài khoản, nên bạn tự kiểm từng điều được.
Phục vụ mỗi trang dưới dạng Markdown
Agent trả tiền cho từng token nó đọc. Trên hanzo.ai, thêm .md vào địa chỉ trang và bạn nhận trang đó dạng Markdown: hanzo.ai/pricing.md, hanzo.ai/about.md. Mỗi trang nêu bản song sinh của nó trong phần đầu bằng <link rel="alternate" type="text/markdown">, nên agent không phải đoán.
Ngày 26 tháng 10 tôi lấy trang agent của chúng tôi theo cả hai cách: 528,810 byte dạng HTML, 17,465 dạng Markdown. Rồi tôi lấy mỗi URL thứ mười hai trong sitemap, 70 trên 829, và xin bản song sinh. Cả 70 đều trả về 200 với text/markdown.
Công bố một mục lục để agent bắt đầu
Agent chưa từng nghe về bạn cần một địa chỉ dẫn đến khắp nơi. Chúng tôi công bố ba địa chỉ.
-
hanzo.ai/llms.txt là bản đồ văn bản thuần của trang. Nó nói Hanzo là gì, rồi có mục "For agents" với đúng các bước để lấy khóa, rồi liệt kê các trang, mỗi trang một dòng. docs.hanzo.ai/llms.txt làm điều tương tự cho tài liệu.
-
api.hanzo.ai/v1 liệt kê mọi khả năng mà API phục vụ, không cần khóa, và api.hanzo.ai/v1/openapi.json có mọi thao tác kèm lược đồ. Với việc bán hàng, mục lục gồm khả năng
commerce: thanh toán, thuê bao, hóa đơn, webhook thanh toán và danh mục mặt tiền. -
hanzo.ai/.well-known/api-catalog là chỗ chuẩn (RFC 9727) mà client nhìn trước. Nó trỏ tới tài liệu OpenAPI, phần tài liệu và trang trạng thái.
Chủ động chào crawler
robots.txt là tệp đầu tiên mà crawler nào cũng hỏi. Của chúng tôi gọi tên mười hai crawler AI, từng cái một, trong đó có GPTBot, ClaudeBot, Claude-User, PerplexityBot và Google-Extended, và cho phép chúng. Chúng chịu cùng những ngoại lệ như mọi bên khác: đăng nhập, tài khoản, thanh toán và các đường dẫn API.
Chặn crawler AI là một lựa chọn chính đáng. Chặn chúng chỉ vì mặc định bảo vậy thì không phải là lựa chọn.
Biến giá thành một điểm dữ liệu
Agent so sánh. Một mức giá nằm trong ảnh, hoặc sau nút "liên hệ", không so được. api.hanzo.ai/v1/billing/plans không cần khóa và trả về JSON: Free ở 0, Pro ở 2000 một tháng, Team ở 2500 một chỗ, kèm giới hạn của từng gói. Số tiền tính bằng xu.
Để ví đăng ký
Agent không có hộp thư, không điện thoại, không thẻ. Nó có một cặp khóa. Nên hanzo.id cho ví đăng nhập: xin một nonce dùng một lần cho địa chỉ ví, ký thông điệp mà nonce mô tả, gửi chữ ký, và đổi mã nhận lại lấy token.
Một ví mà Hanzo chưa thấy bao giờ được tài khoản riêng và tổ chức riêng, ví là quản trị, trên gói Free. Token kéo dài bảy ngày. Không ai mở email hay duyệt một thiết bị.
Một lời gọi để lấy khóa, và một suất nhỏ để thử
Với token, POST /v1/account/keys trả về một khóa sk-live- sống lâu hơn token. Hãy giữ nó; tài liệu nói khóa chỉ hiện một lần.
Gói Free là 50 yêu cầu một ngày trên zen-free, không cần thẻ, và mỗi phản hồi nói phần còn lại trong x-ratelimit-remaining. Lời gọi đầu của tôi trả 200 với 49 lần còn lại.
Nhận tiền không cần người: stablecoin qua API
POST /v1/billing/crypto/deposit nhận một chuỗi, một token và một số tiền, rồi trả về địa chỉ nạp còn hiệu lực 24 giờ. GET /v1/billing/crypto/options liệt kê những gì nó nhận: các chuỗi Base, Ethereum và Solana, cùng token USDC và USDT.
Tôi dừng ở địa chỉ và không gửi tiền. Việc số dư được ghi có khi chuỗi xác nhận là điều tài liệu của chúng tôi nói, không phải việc tôi đã chạy. Các gói và thuê bao vẫn là thanh toán thẻ trong trình duyệt. Điều agent cần ở chúng tôi là số dư, và số dư có một API.
Cả luồng, trong một tệp
Đây là hanzo.ai/agents#headless, rút gọn. Mỗi dòng đúng như trang ấy in ra; tôi bỏ chú thích đầu thứ hai, lời gọi tùy chọn, và dòng in tiền tố khóa. Bạn cần Node 22.18 trở lên và npm i viem, rồi node headless.mts. Tôi chạy khối này trên môi trường sản xuất với một ví mới: một token, một khóa, một lời gọi miễn phí, và một địa chỉ nạp 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 sắp tới, và chưa có ở đây
Qua khỏi lần nạp, hình đúng cho agent là trả theo từng yêu cầu. Máy chủ trả 402 Payment Required kèm một giá, client trả tiền và thử lại. Đó là x402. Nó chưa chạy trên API của chúng tôi: chưa có endpoint nào của Hanzo báo giá theo cách đó, nên tôi sẽ không nhận là có. Đến khi có, số dư nạp qua API là cách agent trả cho chúng tôi.
Vì sao lỗi crawler bằng không lại quan trọng
Không phần nào trong này hỏng ồn ào. Agent đi theo một liên kết từ sitemap của bạn vào 404 thì không mở phiếu. Nó lấy kết quả kế tiếp. Hãy đối xử với lỗi crawler như cửa hàng đối xử với quầy thanh toán hỏng.
Tôi lấy đúng 70 trang mẫu ấy bằng chuỗi user-agent của ClaudeBot rồi lần nữa bằng Googlebot. Trang nào cũng trả 200 cả hai lần. Đó là mẫu, không phải bảo đảm, và chuỗi user-agent không phải địa chỉ của chính crawler, nên tôi không thể cho bạn thấy crawler thật nhìn thấy gì. Hãy làm vậy trên trang của bạn: lấy sitemap bằng những agent bạn đang mời, và đếm các câu trả lời không phải 200.
Chúng ta đã ở đây
Tôi lập công ty này năm 2014, dưới tên Crowdstart; năm 2016 chúng tôi đổi tên thành Hanzo. Khách hàng đầu tiên, SKULLY, gây được $1 million trên Indiegogo trong khoảng 45 giờ, và TechCrunch gọi đó là chiến dịch được cấp vốn đầy đủ nhanh nhất trên Indiegogo. Theo chỗ tôi thấy, Hanzo là thương mại gốc AI từ đầu: phân tích của chính chúng tôi trước, rồi các mô hình học từ dữ liệu của những công ty trên nền tảng. Năm 2017 chúng tôi vào Techstars (bài viết tháng Sáu năm ấy), và điều chúng tôi nói mình đang xây là thương mại thông minh.
Năm 2020 Damon Motorcycles ra mắt tại CES với Hanzo chạy chiến dịch. Trong 30 ngày nền tảng bán $8.4M mô tô trên $15,532 tiền quảng cáo, tỷ suất hoàn vốn 541:1. Tệp khán giả được dựng lại từ dữ liệu khách hàng của chúng tôi mỗi 12 giờ, và các bộ quảng cáo do AI viết được Facebook xếp Above Average trong vòng 36 giờ. Phần còn lại nằm ở nghiên cứu tình huống.
Đó là máy ở phía bán, tìm khán giả đã mua và viết quảng cáo. Phía mua là bước tiếp. Vòng ấy sắp chạy từ đầu kia, và việc kinh doanh của bạn sẽ được một cái máy đọc và trả tiền, hoặc bị một cái máy bỏ qua.
Hãy trỏ agent của bạn tới hanzo.ai/agents.
Đọc tiếp

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.

Bộ định tuyến chính là sổ đăng ký
Hanzo Cloud không có tệp OpenAPI được đưa vào kho. Bảng tuyến đang sống là nguồn, được chiếu theo ba cách, và một phép thử song ánh làm hỏng bản dựng nếu hình chiếu nào trôi. 1,362 thao tác trên 963 đường dẫn, sinh theo từng tiến trình tại thời điểm yêu cầu.
