Google Completion API
Generate text with Google Gemini models through ajan's public API. Supports normal and streaming completions and is fully compatible with the official Vertex AI SDKs (Python / Node).
Google Completion Endpoint (v1beta)
Before You Start
- API key: To use the API, create a personal API key or ask your workspace admin for a workspace API key with the Completion API scope.
Base URL
https://api.ajan.io/google/{region}/v1beta/models/{model}:generateContentHow It Works
This endpoint exposes Google Gemini models that are hosted in Google Vertex AI.\ It mirrors the structure of the official Vertex generateContent API. To use it, you need to:
Get available models
Call GET /{region}/v1beta/models/ to retrieve the list of Gemini models.
Pick a model & action
Choose a model ID and decide between generateContent or streamGenerateContent.
Send your request
POST to /{region}/v1beta/models/{model}:{action} with your prompt in contents.
Handle the response
Parse the JSON response for normal calls or consume the SSE events for streaming.
β’ Region selection (eu or us)\ β’ Optional Server-Sent Event (SSE) streaming with the same event labels used by the Google Python SDK (message_start, message_delta, message_stop)\ β’ A models discovery endpoint
Authentication
Send one of the following headers while using the ajan API Key:
Bearer \
Alternative header for the same API key.
Convenience header used by the official google-generative-ai Python SDK.
All headers are treated identically. Missing or invalid keys return 401 Unauthorized.
Authorization header example:
curl -H "Authorization: Bearer $LD_API_KEY" \
https://api.ajan.io/google/eu/v1beta/modelsx-api-key header example:
curl -H "x-api-key: $LD_API_KEY" \
https://api.ajan.io/google/eu/v1beta/modelsx-goog-api-key header example:
curl -H "x-goog-api-key: $LD_API_KEY" \
https://api.ajan.io/google/eu/v1beta/models1. List available models
GET /{region}/v1beta/models
region must be eu or us.
Successful response
List of objects with the following shape:
- name β Fully-qualified model name (e.g.
models/gemini-2.5-flash). - supportedGenerationMethods β Always
["generateContent", "streamGenerateContent"].
curl -H "Authorization: Bearer $LD_API_KEY" \
https://api.ajan.io/google/eu/v1beta/models2. Generate content
POST /{region}/v1beta/models/{model}:{action}
β’ model β The model ID as returned by the models endpoint (without the models/ prefix).\ β’ action β generateContent or streamGenerateContent depending on whether you want to use streaming or not.
Example path: google/eu/v1beta/models/gemini-2.5-flash:streamGenerateContent
Request body
The request body follows the official GenerateContentRequest structure.
Required fields
contents (Content\[], required)\ Conversation history. Each object has a role (string) and parts array containing objects with text (string).
"contents": [
{
"role": "user",
"parts": [
{
"text": "What's the weather like?"
}
]
}
]Parts can also be functionCall and functionResponse objects for function calling. When you use a Gemini 3 model, return the thoughtSignature (and function-call id) from the model's functionCall part unchanged in your next request. The official SDKs do this for you; if you build requests by hand, copy the fields as-is.
model (string, required)\ The model to use for generation (e.g., "gemini-2.5-pro", "gemini-2.5-flash").
Optional fields
generationConfig (object, optional)\ Configuration for text generation. Supported fields:
temperature(number): Controls randomness (0.0-2.0)topP(number): Nucleus sampling parameter (0.0-1.0)topK(number): Top-k sampling parametercandidateCount(number): Number of response candidates to generatemaxOutputTokens(number): Maximum number of tokens to generatestopSequences(string\[]): Sequences that will stop generationresponseMimeType(string): MIME type of the responseresponseSchema(object): Schema for structured output
"generationConfig": {
"temperature": 0.7,
"topP": 0.9,
"topK": 40,
"maxOutputTokens": 1000,
"stopSequences": ["END", "STOP"]
}safetySettings (SafetySetting\[], optional)\ Array of safety setting objects. Each object contains:
category(string): The harm category (e.g., "HARM\_CATEGORY\_HARASSMENT")threshold(string): The blocking threshold (e.g., "BLOCK\_MEDIUM\_AND\_ABOVE")
"safetySettings": [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
}
]tools (Tool\[], optional)\ Array of tool objects for function calling. Each tool contains functionDeclarations array with:
name(string): Function namedescription(string): Function descriptionparameters(object): JSON schema defining function parameters
"tools": [
{
"functionDeclarations": [
{
"name": "get_weather",
"description": "Get current weather information",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City name"
}
}
}
}
]
}
]toolConfig (object, optional)\ Configuration for function calling. Contains functionCallingConfig with:
mode(string): Function calling mode ("ANY", "AUTO", "NONE")allowedFunctionNames(string\[]): Array of allowed function names
"toolConfig": {
"functionCallingConfig": {
"mode": "ANY",
"allowedFunctionNames": ["get_weather"]
}
}systemInstruction (string | Content, optional)\ System instruction to guide the model's behavior. Can be a string or Content object with role and parts.
"systemInstruction": {
"role": "system",
"parts": [
{
"text": "You are a weather agent. Use the weather tool when asked about weather."
}
]
}Minimal example
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $LD_API_KEY" \
https://api.ajan.io/google/us/v1beta/models/gemini-2.5-pro:generateContent \
-d '{
"contents": [{
"role": "user",
"parts": [{"text": "Write a short poem about the ocean."}]
}]
}'Streaming
When action is streamGenerateContent the endpoint returns an text/event-stream with compatible events:
β’ message_start β first chunk that contains content\ β’ message_delta β subsequent chunks\ β’ message_stop β last chunk (contains finishReason and usage metadata)
Example message_delta event:
event: message_delta
data: {
"candidates": [
{
"index": 0,
"content": {
"role": "model",
"parts": [{ "text": "The ocean whispers..." }]
}
}
]
}Python SDK example with function calling:
import google.generativeai as genai
def get_current_weather(location):
"""Get the current weather in a given location"""
return f"The current weather in {location} is sunny with a temperature of 70 degrees and a wind speed of 5 mph."
genai.configure(
api_key="<YOUR_AJAN_API_KEY>",
transport="rest",
client_options={"api_endpoint": "https://api.ajan.io/google/<REGION>/"},
)
model = genai.GenerativeModel("gemini-2.5-flash", tools=[get_current_weather])
response = model.generate_content(
"Please tell me the weather in San Francisco, then tell me a story on the history of the city"
)
print(response)Python SDK streaming example:
model = genai.GenerativeModel("gemini-2.5-flash")
response = model.generate_content(
"Tell me an elaborate story on the history of the city of San Francisco",
stream=True,
)
for chunk in response:
if chunk.text:
print(chunk.text)Using Google-compatible libraries
The endpoint is fully compatible with official Google SDKs including the Vertex AI Node SDK (@google-cloud/vertexai), Google Generative AI Python library (google-generative-ai), and the Vercel AI SDK for edge streaming.
OpenAPI
openapi: 3.0.0
info:
title: ajan API
version: 3.0.0
servers:
- url: https://api.ajan.io
description: Production
security:
- bearerAuth: []
paths:
/google/{region}/v1beta/models/{model}:generateContent:
post:
tags:
- Google
summary: Generate Content
description: >-
Generate content using Google Gemini models.
This endpoint mirrors the structure of the official Vertex AI
generateContent API while adding API-key based authentication and region
selection.
operationId: google_generate_content_post
parameters:
- name: region
in: path
required: true
description: The region of the API to use.
schema:
type: string
enum:
- eu
- us
- name: model
in: path
required: true
description: The model ID (e.g., gemini-2.5-pro, gemini-2.5-flash).
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
contents:
type: array
description: >-
Conversation history. Parts may be text, functionCall, or
functionResponse.
items:
type: object
properties:
role:
type: string
enum:
- user
- model
parts:
type: array
items:
type: object
properties:
text:
type: string
thoughtSignature:
type: string
description: >-
Return unchanged on the follow-up turn (required
for Gemini 3).
functionCall:
type: object
properties:
name:
type: string
args:
type: object
id:
type: string
description: >-
Return unchanged on the follow-up turn
(required for Gemini 3).
functionResponse:
type: object
properties:
name:
type: string
response:
type: object
id:
type: string
description: >-
Return unchanged on the follow-up turn
(required for Gemini 3).
required:
- contents
example:
contents:
- role: user
parts:
- text: Write a short haiku about the ocean.
responses:
'200':
description: Successful Response
content:
application/json:
schema:
type: object
properties:
candidates:
type: array
items:
type: object
properties:
content:
type: object
finishReason:
type: string
usageMetadata:
type: object
4XX:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- bearerAuth: []
components:
schemas:
ErrorResponse:
properties:
type:
default: error
enum:
- error
title: Type
type: string
error:
discriminator:
mapping:
api_error:
$ref: '#/components/schemas/APIError'
authentication_error:
$ref: '#/components/schemas/AuthenticationError'
invalid_request_error:
$ref: '#/components/schemas/InvalidRequestError'
not_found_error:
$ref: '#/components/schemas/NotFoundError'
overloaded_error:
$ref: '#/components/schemas/OverloadedError'
permission_error:
$ref: '#/components/schemas/PermissionError'
rate_limit_error:
$ref: '#/components/schemas/RateLimitError'
propertyName: type
oneOf:
- $ref: '#/components/schemas/InvalidRequestError'
- $ref: '#/components/schemas/AuthenticationError'
- $ref: '#/components/schemas/PermissionError'
- $ref: '#/components/schemas/NotFoundError'
- $ref: '#/components/schemas/RateLimitError'
- $ref: '#/components/schemas/APIError'
- $ref: '#/components/schemas/OverloadedError'
title: Error
required:
- type
- error
title: ErrorResponse
type: object
APIError:
properties:
type:
default: api_error
enum:
- api_error
title: Type
type: string
message:
default: Internal server error
title: Message
type: string
required:
- type
- message
title: APIError
type: object
AuthenticationError:
properties:
type:
default: authentication_error
enum:
- authentication_error
title: Type
type: string
message:
default: Authentication error
title: Message
type: string
required:
- type
- message
title: AuthenticationError
type: object
InvalidRequestError:
properties:
type:
default: invalid_request_error
enum:
- invalid_request_error
title: Type
type: string
message:
default: Invalid request
title: Message
type: string
required:
- type
- message
title: InvalidRequestError
type: object
NotFoundError:
properties:
type:
default: not_found_error
enum:
- not_found_error
title: Type
type: string
message:
default: Not found
title: Message
type: string
required:
- type
- message
title: NotFoundError
type: object
OverloadedError:
properties:
type:
default: overloaded_error
enum:
- overloaded_error
title: Type
type: string
message:
default: Overloaded
title: Message
type: string
required:
- type
- message
title: OverloadedError
type: object
PermissionError:
properties:
type:
default: permission_error
enum:
- permission_error
title: Type
type: string
message:
default: Permission denied
title: Message
type: string
required:
- type
- message
title: PermissionError
type: object
RateLimitError:
properties:
type:
default: rate_limit_error
enum:
- rate_limit_error
title: Type
type: string
message:
default: Rate limited
title: Message
type: string
required:
- type
- message
title: RateLimitError
type: object
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: API Key
description: API key as Bearer token. Format "Bearer YOUR_API_KEY"