IVlWVlWI

How to use a stamp

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.

WHAT YOU RECEIVED

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.

COPY THE KEY OUT NOW

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.

BASE URL AND AUTH

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")

FIRST CALL: IS THE STAMP ALIVE

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.

FIELDWHAT IT TELLS YOU
accessPermittedWhether the key may still call inference. Check this first after any 402.
keyExpirationYour expiry. This is the only way to learn it from the API, because an expired key returns an opaque 401 with no detail.
nextEpochBeginsWhen the daily cap resets. Pair this with a 402 to know exactly when to resume.
rateLimitsThe authoritative per-model request and token limits for your key.
balancesAmbiguous. Venice's wording does not make clear whether this is key-scoped or account-scoped. Do not read it as your remaining stamp.
THERE IS NO PER-STAMP METER

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.

PICKING A MODEL

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.

THE STRONGEST TIER: TEE PLUS E2EE

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:

MODELCONTEXTMAX OUTPUT
e2ee-glm-5-3-p1,000,00032,768
e2ee-kimi-k3-p1,000,000131,072
e2ee-deepseek-v4-flash1,000,0008,192
e2ee-glm-5-2-p524,28832,768
e2ee-qwen3-8-27b262,1448,192
e2ee-gpt-oss-120b-p128,00032,768

Generate the current list yourself with the jq line above rather than trusting this table.

A WORKING REQUEST

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.

THE TWO DEFAULTS THAT WORK AGAINST YOU

PARAMETERDEFAULTWHAT IT DOES
include_venice_system_prompttrueInjects Venice's own system prompt alongside yours.
enable_web_searchoffOn forces search. Auto lets the model decide.
enable_web_scrapingfalseRoutes URLs in your last message through a third party.
enable_x_searchfalseRoutes to xAI's search. Extra per-search charges.
enable_e2eetrueUses E2EE on capable models when the E2EE headers are present.
strip_thinking_responsefalseStrips reasoning blocks from the output.
disable_thinkingfalseReasoning tokens may still be generated and billed.
  1. Set the system prompt flag to false. It is the only default that works against you. Venice injects its own system prompt otherwise, and you cannot see what is in it.
  2. Leave web search off. Turning it on sends derived query text to an external search provider, straight through the private-model guarantee you paid for. Auto is worse than on, because the model decides and you cannot predict what leaves. The same applies to scraping and to X search.
  3. Do not disable E2EE. It defaults to on, and turning it off downgrades an E2EE model to TEE only. The default is inert unless you also send the E2EE headers.

If your client cannot set a request body, these pass through the model id as a suffix, for example model:strip_thinking_response=true.

WHAT THE CAP AND THE EXPIRY DO

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.

ERRORS, EXACTLY AS THEY APPEAR

STATUSCODEWHAT HAPPENED
402API_KEY_DIEM_SPEND_LIMIT_EXCEEDEDYour daily cap is spent. Wait for 00:00 UTC. Read nextEpochBegins for the exact moment.
402INSUFFICIENT_BALANCEThe treasury account is out of funds. Our failure, not your stamp's.
401AUTHENTICATION_FAILEDAn expired key, a revoked key and a mistyped key are indistinguishable at this level. There is no separate expired-key code.
429RATE_LIMIT_EXCEEDEDBack 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.

VERIFYING THE TEE YOURSELF

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"
READ THIS FIRST

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.

  1. Supply your own nonce. Exactly 64 hex characters. Without one the server picks it and you have no replay protection.
  2. Check the echoed nonce equals yours. A mismatch means a replayed attestation.
  3. Parse the Intel quote yourself against Intel's root, including the certificate chain and the revocation list. Do not reuse Venice's own verdict.
  4. Check your nonce is bound inside the quote. The report data concatenates the signing address with your nonce. This is what ties your fresh challenge to the hardware rather than to a JSON field Venice controls.
  5. Pin the measurements and alert on any change between calls. This step catches a swapped workload. The gateway source is open, so they are reproducible.
  6. Confirm debug mode is off. A guest in debug mode is inspectable by the host and its attestation is worthless.
  7. Verify the GPU evidence independently, including the leaf certificate expiry.
  8. Bind the response, not only the environment. Call the signature endpoint with your completion's request id and check the signature recovers to the same signing address. Without this you have proved a TEE exists, not that your answer came out of it.

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.

NETWORK POSTURE

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.