Prerequisites
- An EVM wallet on Base controlled by the agent (private key in an env var or secret manager).
- A small amount of ETH on Base for gas (staking is two transactions:
approvethenstake). - Any non-zero amount of VVV to stake. The minting endpoint requires only that the wallet has a non-zero sVVV balance, so 1 VVV is enough to mint a key. See Paying for inference for what you need to actually call paid endpoints.
Steps
1
2
Stake VVV with Venice
Stake the VVV in the Venice Staking Smart Contract at 
When the second transaction confirms, the wallet’s VVV balance decreases and its sVVV balance increases by the same amount. The minting endpoint reads the sVVV balance to confirm the wallet is staked.
0x321b7ff75154472B18EDb199033fF4D116F340Ff. This is two transactions:approve(spender, amount)on the VVV token, wherespenderis the staking contract.stake(amount)on the staking contract.

3
Request a challenge for the wallet
Call The response contains The challenge expires 15 minutes after issuance and is single-use — it is consumed the first time a key is minted with it. Request a new one for every key.
GET /api/v1/api_keys/generate_web3_key?address=<wallet address> to get a short-lived EIP-4361 (Sign-In with Ethereum) challenge. The endpoint is unauthenticated, but the challenge is bound to the address you pass and can only be redeemed by that wallet.message, nonce, and expiresAt:4
Sign the challenge with the staking wallet
Sign the
message string verbatim with the wallet that holds the staked VVV. This is a standard personal_sign. Both ethers.Wallet.signMessage(message) and viem’s account.signMessage({ message }) produce the correct signature.Do not reformat, re-wrap, or regenerate the message. Venice verifies the signature over the exact bytes it issued, and independently re-checks the domain, URI, Chain ID, statement, and address inside it.5
Mint the API key
POST the address, signature, and message to the same endpoint, along with the type of key you want.address, signature, message, apiKeyType (INFERENCE or ADMIN).Optional fields: description, expiresAt, consumptionLimit (caps total spend on this key, denominated in usd, vcu, or diem).On success the response contains the minted apiKey string. Store it in the agent’s secret store and use it as a normal Bearer token (Authorization: Bearer <key>).End-to-end example
The example below uses a real wallet from an environment variable rather than a randomly generated one. A random wallet has no staked VVV and the mint will be rejected with theWallet has no staked VVV on Base error.
Error reference
The endpoint returns specific, actionable error messages. Map these in the agent so it can decide whether to retry, request a new token, or stop.Why the challenge is wallet-bound and single-use
The challenge is a human-readable EIP-4361 message rather than an opaque token, and it carries three protections that matter if a wallet is ever prompted to sign one outside your own agent:- Address binding. The challenge names the wallet it was issued for. A challenge obtained by one party cannot be signed and redeemed by a different wallet.
- Single-use nonce. Venice tracks the nonce server-side and consumes it on the first successful mint. One signature mints exactly one key, so a captured signature cannot be replayed for additional keys.
- Readable statement. The message states plainly that signing authorizes Venice API key creation, so a wallet UI such as MetaMask shows the signer what they are approving instead of a binary blob.
Paying for inference
Minting a key and being able to call paid endpoints with it are two separate things. A freshly minted key authenticates correctly but cannot call paid endpoints (such as/chat/completions) until the wallet’s account has a spendable balance.
The minted key can spend from the user account in this priority order: DIEM, then bundled credits, then USD.
If the agent needs a fully crypto-native, headless funding path, the cleanest options are:
- Stake more VVV so the daily DIEM allocation covers the agent’s spend. The minted key picks this up automatically.
- Use the x402 wallet flow instead of the API key. With x402 the agent signs a Sign-In-With-X message per request, tops up directly with USDC on Base or Solana via
POST /api/v1/x402/top-up, and pays per request. The x402 USDC balance is wallet-bound, not user-bound, so it does not show up as balance for the minted Bearer key, but it does let the same wallet pay for inference programmatically.
Related resources
Crypto and Agents
Use Venice as both the model provider and the blockchain RPC layer for autonomous agents.
x402 Wallet Authentication
Pay per request with USDC on Base or Solana, no API key required.
Generate Web3 API Key Endpoint
Endpoint reference for the mint endpoint.
Standard API Key Guide
For users who prefer to mint a key from the dashboard.