Base URL
https://zusd-testnet---zevrouter-staging-skwx3z2gxa-uc.a.run.app/api/v1
Quickstart
Use an OpenAI-compatible base URL, your ZevRouter API key, and familiar provider/model IDs.
https://zusd-testnet---zevrouter-staging-skwx3z2gxa-uc.a.run.app/api/v1
base_url = "https://zusd-testnet---zevrouter-staging-skwx3z2gxa-uc.a.run.app/api/v1" api_key = "zvr_REPLACE_ME" model = "google/gemini-3.8-flash"
google/gemini-3.8-flashgoogle/gemini-3.7-flashgoogle/gemini-3.6-flashgoogle/gemini-3.5-flashgoogle/gemini-3-flash-previewgoogle/gemini-2.5-flash-litegoogle/gemini-2.5-flashgoogle/gemini-2.5-procurl "https://zusd-testnet---zevrouter-staging-skwx3z2gxa-uc.a.run.app/api/v1/chat/completions" \
-H "Authorization: Bearer zvr_REPLACE_ME" \
-H "Content-Type: application/json" \
-d '{
"model": "google/gemini-3.8-flash",
"max_tokens": 256,
"messages": [
{ "role": "user", "content": "Say hello from ZEV AI Gateway." }
]
}'
Most requests only need a model and messages. Routing preferences are optional.
{
"model": "google/gemini-3.8-flash",
"routing": "greenest",
"messages": [{ "role": "user", "content": "Use the lowest-carbon route." }]
}
{
"model": "google/gemini-3.8-flash",
"provider_server": "google-vertex/global",
"messages": [{ "role": "user", "content": "Use this provider route." }]
}
const res = await fetch("https://zusd-testnet---zevrouter-staging-skwx3z2gxa-uc.a.run.app/api/v1/chat/completions", {
method: "POST",
headers: {
authorization: "Bearer " + process.env.ZEV_API_KEY,
"content-type": "application/json"
},
body: JSON.stringify({
model: "google/gemini-3.8-flash",
max_tokens: 256,
messages: [{ role: "user", content: "Plan a low-carbon trip." }]
})
});
const data = await res.json();
console.log(data.choices[0].message.content);
console.log(data.zevrouter);
401 means the key is missing, invalid, or revoked.402 means balance, hard limit, or daily limit blocked the request.403 means the model is not enabled for the key.429 means the per-minute request limit was hit.