Body and response match the official Gemini REST API. Paths: /api/v1, /api/v1beta, /api/v1beta2.
/api/v1beta/modelsList models — no body.
curl "https://gemini-relay-proxy.vercel.app/api/v1beta/models" -H "X-API-KEY: <secret>"
/api/v1beta/models/{model}:generateContentBody: JSON contents. Response: candidates / usageMetadata (same as Google).
curl "https://gemini-relay-proxy.vercel.app/api/v1beta/models/gemini-2.5-flash:generateContent" \
-H "Content-Type: application/json" \
-H "X-API-KEY: <secret>" \
--data-raw '{"contents":[{"role":"user","parts":[{"text":"Hello"}]}]}'/api/v1beta/models/{model}:streamGenerateContentSame body as generateContent. Response: streamed chunks.
curl "https://gemini-relay-proxy.vercel.app/api/v1beta/models/gemini-2.5-flash:streamGenerateContent" \
-H "Content-Type: application/json" \
-H "X-API-KEY: <secret>" \
--data-raw '{"contents":[{"role":"user","parts":[{"text":"Hello"}]}]}'401Missing or invalid credential503Proxy headers OK but GEMINI_API_KEYS unset; or MCP without PROXY_AUTH_HEADERS403Empty body on POST / PUT / PATCHFull field reference: Google Gemini API docs. Auth examples below use proxy headers — swap for passthrough (?key= / x-goog-api-key) as needed.