Gemini relay
Gemini generateContent
Pass-through to Google Gemini's native API, supporting generateContent, streamGenerateContent, and countTokens (estimated locally). Useful for SDKs and tools that speak the Gemini wire format, such as Gemini CLI. Authenticate with the Authorization: Bearer or x-goog-api-key header; a key in the key query parameter is rejected.
POST
/v1/gemini/v1beta/models/{model}:generateContentKey request parameters
| Parameter | Type | Description |
|---|---|---|
model | string · Required (path) | Gemini model identifier, e.g. gemini-3-pro-image-preview |
contents | Content[] · Required | Conversation contents with role + parts |
contents[].role | string | user or model |
contents[].parts | Part[] | Ordered parts — text, inline_data, file_data, etc. |
contents[].parts[].text | string | Text content of a part |
generationConfig | object | Sampling and output shaping |
generationConfig.responseModalities | string[] | e.g. ["TEXT","IMAGE"] |
generationConfig.imageConfig.aspectRatio | string | e.g. 16:9 |
generationConfig.imageConfig.imageSize | string | e.g. 4K |
Key response parameters
| Parameter | Type | Description |
|---|---|---|
candidates | Candidate[] | Generated candidates |
candidates[].content.role | string | Always model |
candidates[].content.parts | Part[] | Generated parts (text and/or inline image data) |
candidates[].finishReason | string | STOP, MAX_TOKENS, SAFETY, etc. |
candidates[].safetyRatings | Rating[] | Per-category safety ratings |
usageMetadata.promptTokenCount | integer | Tokens in the prompt |
usageMetadata.candidatesTokenCount | integer | Tokens generated |
usageMetadata.totalTokenCount | integer | Sum |
Integration examples
Replace the API key and model ID in these examples with your values.
cURL
curl https://hashbidx.ai/v1/gemini/v1beta/models/gemini-3-pro-image-preview:generateContent \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"contents": [{"role":"user","parts":[{"text":"draw a cat"}]}],
"generationConfig": {
"responseModalities": ["TEXT","IMAGE"],
"imageConfig": {"aspectRatio":"16:9","imageSize":"4K"}
}
}'Python
import httpx
resp = httpx.post(
"https://hashbidx.ai/v1/gemini/v1beta/models/gemini-3-pro-image-preview:generateContent",
headers={"Authorization": "Bearer <YOUR_API_KEY>"},
json={
"contents": [{"role": "user", "parts": [{"text": "draw a cat"}]}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": {"aspectRatio": "16:9", "imageSize": "4K"},
},
},
)
resp.raise_for_status()
print(resp.json())Node.js
const resp = await fetch(
"https://hashbidx.ai/v1/gemini/v1beta/models/gemini-3-pro-image-preview:generateContent",
{
method: "POST",
headers: {
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json",
},
body: JSON.stringify({
contents: [{ role: "user", parts: [{ text: "draw a cat" }] }],
generationConfig: {
responseModalities: ["TEXT", "IMAGE"],
imageConfig: { aspectRatio: "16:9", imageSize: "4K" },
},
}),
},
);
console.log(await resp.json());Go
body, _ := json.Marshal(map[string]any{
"contents": []map[string]any{{
"role": "user",
"parts": []map[string]any{{"text": "draw a cat"}},
}},
"generationConfig": map[string]any{
"responseModalities": []string{"TEXT", "IMAGE"},
"imageConfig": map[string]any{
"aspectRatio": "16:9",
"imageSize": "4K",
},
},
})
req, _ := http.NewRequest("POST",
"https://hashbidx.ai/v1/gemini/v1beta/models/gemini-3-pro-image-preview:generateContent",
bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer <YOUR_API_KEY>")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)Rust
let body = serde_json::json!({
"contents": [{"role": "user", "parts": [{"text": "draw a cat"}]}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": {"aspectRatio": "16:9", "imageSize": "4K"},
},
});
let resp = reqwest::Client::new()
.post("https://hashbidx.ai/v1/gemini/v1beta/models/gemini-3-pro-image-preview:generateContent")
.bearer_auth("<YOUR_API_KEY>")
.json(&body)
.send().await?;If the response includes X-Request-Id, include it when troubleshooting an issue.