A stamp is an ordinary Venice API key with two restrictions baked in. It calls private models only, and it spends its tier's DIEM in any one UTC day until it expires.
The API is OpenAI-compatible, so any client that lets you set a base URL works.
IVlWVlWI stamp M key: <your venice api key> until: 2026-09-28T12:34Z use: https://api.venice.ai/api/v1 - private models only - Tor https://xn--ojq.app
until is the expiry, to the minute, in UTC. After that instant the key returns 401 and cannot be renewed, extended or recovered.
It exists in that memo and nowhere else. Our ledger records the key's id, not the key. Venice returns a key's full value once, at creation, and every later read shows only its last six characters. If you lose the memo, nobody can reissue it, including us.
https://api.venice.ai/api/v1
A bearer token in the Authorization header. That is the whole auth model.
export VENICE_API_KEY='<the key from your memo>'
Because the API is OpenAI-shaped, most SDKs work by setting the base URL:
from openai import OpenAI
client = OpenAI(api_key=VENICE_API_KEY,
base_url="https://api.venice.ai/api/v1")
curl https://api.venice.ai/api/v1/api_keys/rate_limits \ -H "Authorization: Bearer $VENICE_API_KEY"
This is the only endpoint under /api_keys or /billing that an inference key may call. Every other one returns 401 asking for an admin key.
| FIELD | WHAT IT TELLS YOU |
|---|---|
accessPermitted | Whether the key may still call inference. Check this first after any 402. |
keyExpiration | Your expiry. This is the only way to learn it from the API, because an expired key returns an opaque 401 with no detail. |
nextEpochBegins | When the daily cap resets. Pair this with a 402 to know exactly when to resume. |
rateLimits | The authoritative per-model request and token limits for your key. |
balances | Ambiguous. Venice's wording does not make clear whether this is key-scoped or account-scoped. Do not read it as your remaining stamp. |
No Venice endpoint exposes how much of a key's own cap has been spent. Neither we nor you can read "0.3 of 1 DIEM used today". Anyone promising a live remaining-balance readout sourced from Venice alone is guessing. What you can do instead: every completion response carries a usage object with token counts. Multiply by the model's price from GET /models and keep your own running total.
GET /models is public and needs no key, so you can browse before you buy.
curl "https://api.venice.ai/api/v1/models?type=text"
The field that governs your key is the model's privacy value. It reads private or anonymized. Your key can call private and cannot call anonymized. List exactly what your stamp may call:
curl -s "https://api.venice.ai/api/v1/models?type=text" \
| jq -r '.data[] | select(.model_spec.privacy=="private")
| "\(.id)\t\(.model_spec.availableContextTokens)"'
Run that before your first call. It is cheaper than reading an error you cannot decode.
What the restriction excludes. On 21 September 2026, of 117 text models, 68 were private and 49 anonymized. Every Claude model, every Gemini model and the hosted OpenAI models are anonymized. Your stamp cannot call them.
What it includes, which surprises people. All six Grok models are private, including the two-million-context ones. The open-weight models are private. So are a one-million-context Kimi, a one-million-context DeepSeek, a 480-billion-parameter coder and an explicitly uncensored model. A restricted key sounds like a downgrade and mostly is not.
Twelve text models run inside a trusted execution environment with hardware attestation and support end-to-end encryption. These are the right default for a privacy-first use of a stamp. A snapshot, because model ids churn:
| MODEL | CONTEXT | MAX OUTPUT |
|---|---|---|
e2ee-glm-5-3-p | 1,000,000 | 32,768 |
e2ee-kimi-k3-p | 1,000,000 | 131,072 |
e2ee-deepseek-v4-flash | 1,000,000 | 8,192 |
e2ee-glm-5-2-p | 524,288 | 32,768 |
e2ee-qwen3-8-27b | 262,144 | 8,192 |
e2ee-gpt-oss-120b-p | 128,000 | 32,768 |
Generate the current list yourself with the jq line above rather than trusting this table.
curl https://api.venice.ai/api/v1/chat/completions \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "e2ee-glm-5-3-p",
"messages": [{"role": "user", "content": "Hello"}],
"venice_parameters": {
"include_venice_system_prompt": false,
"enable_web_search": "off"
}
}'
The response is a standard chat completion object with a usage block. Other endpoints your key can reach include responses, embeddings, the image and audio paths, and the async video jobs. All are subject to the same privacy restriction.
| PARAMETER | DEFAULT | WHAT IT DOES |
|---|---|---|
include_venice_system_prompt | true | Injects Venice's own system prompt alongside yours. |
enable_web_search | off | On forces search. Auto lets the model decide. |
enable_web_scraping | false | Routes URLs in your last message through a third party. |
enable_x_search | false | Routes to xAI's search. Extra per-search charges. |
enable_e2ee | true | Uses E2EE on capable models when the E2EE headers are present. |
strip_thinking_response | false | Strips reasoning blocks from the output. |
disable_thinking | false | Reasoning tokens may still be generated and billed. |
If your client cannot set a request body, these pass through the model id as a suffix, for example model:strip_thinking_response=true.
The cap is per UTC day and it resets. A tier M stamp is one DIEM every day for seven days. It is not seven DIEM to spend as you like. If you burn today's allowance by noon, you wait for 00:00 UTC. Unused DIEM does not roll over. This is deliberate: it makes a stamp a daily allowance, not a prepaid balance.
The expiry is absolute. Set at mint, shown in your memo, cannot be extended.
What a DIEM buys. Roughly one dollar of inference. On a one-million-context E2EE model at September 2026 prices, that is about 571,000 input tokens, or about 181,000 output tokens, or about 147 turns of a realistic two-thousand-in, six-hundred-out chat. So a tier M stamp is roughly 150 substantial turns per day for seven days. Prices differ by model and cached input is far cheaper than fresh input, which matters for long conversations.
| STATUS | CODE | WHAT HAPPENED |
|---|---|---|
| 402 | API_KEY_DIEM_SPEND_LIMIT_EXCEEDED | Your daily cap is spent. Wait for 00:00 UTC. Read nextEpochBegins for the exact moment. |
| 402 | INSUFFICIENT_BALANCE | The treasury account is out of funds. Our failure, not your stamp's. |
| 401 | AUTHENTICATION_FAILED | An expired key, a revoked key and a mistyped key are indistinguishable at this level. There is no separate expired-key code. |
| 429 | RATE_LIMIT_EXCEEDED | Back off. Use the rate-limit reset header. |
On a 401, work through the list on the troubleshooting page before concluding the stamp is dead. A re-read of the memo costs nothing and a new stamp costs money.
Two endpoints. Attestation works without a key, so you can check before you buy.
NONCE=$(openssl rand -hex 32) curl "https://api.venice.ai/api/v1/tee/attestation?model=e2ee-glm-5-3-p&nonce=$NONCE"
A verified: true field in that response is Venice asserting that Venice's own attestation passed. If you do not trust Venice, that boolean is exactly the claim under dispute and proves nothing. Real verification happens on your side.
Venice's TEE tier is brokered through third parties rather than running on Venice's own hardware. The attestation chain still verifies against Intel and NVIDIA roots, which is what matters, but the set of parties involved is larger than one name.
Venice sees your key, your prompts, your token counts and your IP address unless you route around it. The stamp makes you unlinkable to us and to the payment. It does not make you invisible to Venice.
Use the stamp over Tor, and not from a network identity you use for anything attributable. Test that your route works before you depend on it. Wait a random interval between receiving a stamp and first using it, so a timing observer cannot pair the delivery with the first call.