Testnet and devnet

Two copies of the Hanzo cloud that take only Square sandbox cards. Testnet runs exactly what production runs; devnet runs what is being built next, with accounts of its own.

After this page you can point your code at a network where no card is ever really charged, and know which one to pick.

Hanzo runs three copies of the same cloud. Each has its own API, its own web app, its own books and its own chain, and only one of them takes real money.

APIWeb appSign-inRunsMoney
mainnethttps://api.hanzo.aihanzo.aihanzo.idthe current releasereal cards
testnethttps://api-test.hanzo.aitest.hanzo.aihanzo.idthe same release as mainnet, alwaysSquare sandbox only
devnethttps://api-dev.hanzo.aiapp-dev.hanzo.aiid-dev.hanzo.aithe dev branch, minutes after each pushSquare sandbox only

Testnet is production's release, byte for byte. Every release that reaches api.hanzo.ai reaches api-test.hanzo.ai in the same step, so a checkout or an integration that works on testnet works on mainnet. Use devnet to try what is coming before it is released.

Pointing a client at a network

Every path is the same /v1 as production. Change the base URL and nothing else.

curl https://api-test.hanzo.ai/v1/models

Testnet and devnet do not accept API keys: an sk- key authenticates on mainnet only. Authenticate with an account token. Testnet takes your Hanzo account's token, the one hanzo.id issues; devnet takes only a devnet account's token, issued by id-dev.hanzo.ai (see Signing in). hanzo auth token prints the token for the network the CLI is on:

import subprocess
from openai import OpenAI

token = subprocess.check_output(["hanzo", "auth", "token"], text=True).strip()
client = OpenAI(base_url="https://api-test.hanzo.ai/v1", api_key=token)

To aim the hanzo CLI at a network, select it; the API and the sign-in host follow:

hanzo network use devnet    # api-dev.hanzo.ai, signing in at id-dev.hanzo.ai
hanzo auth login
hanzo network use mainnet   # back to api.hanzo.ai and hanzo.id

Signing in

Mainnet and testnet share one identity: you sign in with your Hanzo account, the one you use on hanzo.ai. What is separate is everything that account holds: a testnet balance, card on file, invoice or usage record lives only on testnet and is never mixed with your production books.

Devnet has accounts of its own. It runs code that is still being built, so it never sees a production credential: its identity is id-dev.hanzo.ai, a token from hanzo.id is refused at api-dev.hanzo.ai, and a devnet token is refused at api.hanzo.ai. Sign in at id-dev.hanzo.ai, or on app-dev.hanzo.ai, with a devnet account; your hanzo.id account does not exist there.

Paying with a sandbox card

On test.hanzo.ai and app-dev.hanzo.ai/pay the card form is Square's sandbox. No real card is accepted and none is charged; the credit you buy is testnet or devnet credit and spends only there.

CardNumberCVVExpiryPostal code
Visa4111 1111 1111 1111111any future dateany, e.g. 94103
Mastercard5105 1051 0510 5100111any future dateany

To test a decline, use either card with CVV 911, postal code 99999 or expiry 01/40. A client that sends Square nonces directly uses cnon:card-nonce-ok and cnon:card-nonce-declined. Square documents every sandbox value at developer.squareup.com/docs/devtools/sandbox/payments.

What a sandbox network is not

  • Not a way to move real money. It cannot be switched to live payments, and no real card, crypto deposit or payout rail exists on it.
  • Not paid models. Testnet and devnet route Hanzo's free models only; a paid model id is refused.
  • Not a place to keep data. Treat testnet and devnet data as disposable.
  • Devnet is the API, identity and checkout only. It sends no email or SMS, so it signs in by password; it offers no social sign-in, no MPC wallets, no crypto deposits and no builds.
Was this page useful?
Last updated Oct 26, 2026