Aracı dil modelleri çağında vitrinsiz ticaret
Alıcılar aracıya dönüşüyor. Bir dil modelinin arada insan olmadan okuyabilmesi, imzalayabilmesi ve ödeyebilmesi için gerekenler ve Hanzo'nun bugün bunun için sundukları.

Bu sayfada
Headless ticaret vitrini motordan ayırdı, böylece herhangi bir ön yüz tek bir API üzerinden satış yapabildi. O ön yüz her zaman bir insanın baktığı bir şeydi: bir site, bir uygulama, bir kiosk.
Sonraki ön yüz bakmaz. Okur. Alıcı bir aracıya dönüşüyor: bir hedefi, bir bütçesi ve bir araç döngüsü olan, bir plan, bir GPU ya da bir ödeme API'si bulmaya gönderilmiş bir program. Anlayabildiği ve bir insandan yardım istemeden ödeyebildiği yerden satın alır. İşletmenizin bir sayfayı okuması, bir çerez bildirimini kapatması, bir onay e-postasını açması ya da bir kart numarası yazması için bir insana ihtiyacı varsa, aracı bir sonraki sonuca geçer.
Tez budur. Bir işletme, döngüde insan olmadan bir LLM için okunabilir ve işlem yapılabilir olmalıdır. Okunabilir, aracının ne sattığınızı, kaça sattığınızı ve nasıl başlayacağını öğrenebilmesi demektir. İşlem yapılabilir, tek başına bir API üzerinden başlayabilmesi, ödeyebilmesi ve karşılığını alabilmesi demektir.
İşte bunun için gerekenler, madde madde, Hanzo'nun bugün sunduklarıyla birlikte. Aşağıdaki her adres hesapsız yanıt verir, böylece her iddiayı kendiniz denetleyebilirsiniz.
Her sayfayı Markdown olarak sunmak
Bir aracı, okuduğu her token için öder. hanzo.ai üzerinde bir sayfanın adresine .md ekleyin, sayfayı Markdown olarak alırsınız: hanzo.ai/pricing.md, hanzo.ai/about.md. Her sayfa, başlığında <link rel="alternate" type="text/markdown"> ile ikizini adlandırır; böylece aracı tahmin etmek zorunda kalmaz.
26 Ekim'de ajanlar sayfamızı iki yolla da çektim: HTML olarak 528,810 bayt, Markdown olarak 17,465. Sonra sitemap'imizdeki her on ikinci URL'yi aldım, 829 içinden 70, ve ikizini istedim. 70'inin tümü 200 ve text/markdown olarak döndü.
Bir aracının başlayabileceği bir dizin yayımlamak
Sizi hiç duymamış bir aracının her yere götüren tek bir adrese ihtiyacı vardır. Üç tane yayımlıyoruz.
- hanzo.ai/llms.txt sitenin düz metin haritasıdır. Hanzo'nun ne olduğunu söyler, sonra bir anahtar almak için kesin adımların olduğu bir "For agents" bölümü verir, ardından sayfaları satır satır listeler. docs.hanzo.ai/llms.txt belgeler için aynısını yapar.
- api.hanzo.ai/v1 API'nin sunduğu her yeteneği anahtarsız listeler ve api.hanzo.ai/v1/openapi.json her işlemi şemasıyla birlikte içerir. Satış için dizinde bir
commerceyeteneği vardır: ödeme, abonelikler, faturalar, ödeme webhook'ları ve vitrin kataloğu. - hanzo.ai/.well-known/api-catalog bir istemcinin ilk baktığı standart yerdir (RFC 9727). OpenAPI belgesini, belgeleri ve durum sayfasını gösterir.
Crawler'ları bilerek karşılamak
robots.txt, herhangi bir crawler'ın istediği ilk dosyadır. Bizimki on iki yapay zeka crawler'ını tek tek adlandırır, aralarında GPTBot, ClaudeBot, Claude-User, PerplexityBot ve Google-Extended vardır, ve onlara izin verir. Diğer herkesle aynı istisnaları alırlar: oturum açma, hesap, ödeme ve API yolları.
Yapay zeka crawler'larını engellemek meşru bir seçimdir. Varsayılan böyle dedi diye engellemek ise hiç seçim değildir.
Fiyatı bir veri noktası yapmak
Aracılar karşılaştırır. Bir görselin içindeki ya da bir "contact us" düğmesinin arkasındaki fiyat karşılaştırılamaz. api.hanzo.ai/v1/billing/plans anahtar istemez ve JSON döner: Free 0, ayda Pro 2000, koltuk başına Team 2500, her planın limitleri yanında. Tutarlar sent cinsindendir.
Bir cüzdanın kaydolmasına izin vermek
Bir aracının gelen kutusu, telefonu ve kartı yoktur. Bir anahtar çifti vardır. Bu yüzden hanzo.id bir cüzdanı içeri alır: cüzdanın adresi için tek kullanımlık bir nonce isteyin, anlattığı iletiyi imzalayın, imzayı gönderin ve geri gelen kodu bir token ile takas edin.
Hanzo'nun daha önce görmediği bir cüzdan kendi hesabını ve kendi kuruluşunu alır, cüzdan yönetici olur, Free plandadır. Token yedi gün sürer. Kimse bir e-posta açmaz ya da bir cihaz onaylamaz.
Bir anahtar için tek çağrı ve denemek için küçük bir pay
Token ile POST /v1/account/keys, ondan daha uzun yaşayan bir sk-live- anahtarı döner. Saklayın; belgeler onun bir kez gösterildiğini söyler.
Free plan, zen-free üzerinde günde 50 istektir, kart yoktur, ve her yanıt x-ratelimit-remaining içinde kalanı söyler. İlk çağrım 200 döndü, 49 kalmıştı.
İnsan olmadan ödeme almak: API üzerinden stablecoin
POST /v1/billing/crypto/deposit bir zincir, bir token ve bir tutar alır ve 24 saat geçerli bir yatırma adresi döner. GET /v1/billing/crypto/options ne kabul ettiğini listeler: Base, Ethereum ve Solana zincirleri ile USDC ve USDT token'ları.
Adreste durdum ve para göndermedim. Bakiyenin zincir onaylayınca yazılması belgelerimizin söylediğidir, benim çalıştırdığım bir şey değil. Planlar ve abonelikler tarayıcıda kartlı ödemede kalır. Bir aracının bizden istediği bakiyedir, bakiyenin de bir API'si vardır.
Tüm akış, tek bir dosyada
Bu, kısaltılmış haliyle hanzo.ai/agents#headless. Her satır o sayfanın bastığı gibidir; ikinci başlık yorumunu, seçenekler çağrısını ve bir anahtar öneki basan satırı çıkardım. Node 22.18 ya da daha yenisi ve npm i viem gerekir, sonra node headless.mts. Bu bloğu üretimde yeni bir cüzdanla çalıştırdım: bir token, bir anahtar, ücretsiz bir çağrı ve bir USDC yatırma adresi.
// 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 geliyor ve henüz burada değil
Yüklemenin ötesinde, bir aracı için doğru biçim istek başına ödemedir. Sunucu bir fiyatla 402 Payment Required yanıtını verir, istemci öder ve yeniden dener. Bu x402'dir. API'mizde canlı değildir: henüz hiçbir Hanzo uç noktası fiyatı bu şekilde söylemiyor, bu yüzden bunu iddia etmeyeceğim. Bunu yapana kadar, bir aracı bize API üzerinden yüklenmiş bir bakiyeyle öder.
Sıfır crawler hatasının neden önemli olduğu
Bunların hiçbiri gürültüyle bozulmaz. Sitemap'inizdeki bir bağlantıyı izleyip 404'e düşen bir aracı bildirim açmaz. Bir sonraki sonucu alır. Bir crawler hatasını, bir mağazanın bozuk bir kasaya davrandığı gibi ele alın.
Aynı 70 örnek sayfayı ClaudeBot'un user-agent dizisiyle ve bir kez de Googlebot'unkiyle çektim. Her biri iki seferde de 200 yanıtını verdi. Bu bir örneklemedir, garanti değil, ve bir user-agent dizisi crawler'ın kendi adresi değildir, bu yüzden gerçek crawler'ların ne gördüğünü size gösteremem. Kendi sitenizde aynısını yapın: davet ettiğiniz aracılarla sitemap'inizi çekin ve 200 olmayan yanıtları sayın.
Daha önce de burada bulunmuştuk
Bu şirketi 2014'te Crowdstart olarak kurdum; 2016'da adını Hanzo koyduk. İlk müşterimiz SKULLY, Indiegogo'da yaklaşık 45 saatte $1 million topladı ve TechCrunch bunu Indiegogo'daki en hızlı tam fonlanan kampanya diye andı. Bana göre Hanzo en başından yapay zeka yerlisi bir ticaretti: önce kendi analitiğimiz, sonra platformdaki şirketlerin verisinden öğrenen modeller. 2017'de Techstars'a katıldık (o hazirandaki yazı) ve kurduğumuzu söylediğimiz şey akıllı ticaretti.
2020'de Damon Motorcycles, kampanyayı Hanzo yürütürken CES'te çıktı. 30 günde platform, $15,532 reklam harcamasıyla $8.4M motosiklet sattı, 541:1 getiri. Kitleler müşteri verimizden her 12 saatte bir yeniden kuruldu ve yapay zekanın yazdığı reklam setleri 36 saat içinde Facebook'ta Above Average oldu. Gerisi vaka incelemesinde.
Bunlar satış tarafındaki makinelerdi; satın alan kitleleri buluyor ve reklamları yazıyorlardı. Sırada alış tarafı var. Aynı döngü öbür uçtan çalışmak üzere, ve işletmeniz bir makine tarafından okunup ödenecek ya da bir makine tarafından geçilecektir.
Aracınızı hanzo.ai/agents adresine yöneltin.
Devamını oku

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.

Yönlendirici, kayıt defterinin kendisidir
Hanzo Cloud'da depoya girmiş bir OpenAPI dosyası yoktur. Canlı rota tablosu kaynaktır, üç biçimde yansıtılır ve herhangi bir izdüşüm kayarsa bir birebir eşleme testi derlemeyi düşürür. İstek anında süreç başına üretilen, 963 yol üzerinde 1,362 işlem.
