Skip to main content
POST
/
v1beta
/
models
/
{model}
:generateContent
generateContent
curl --request POST \
  --url https://openp.ai/v1beta/models/{model}:generateContent
import requests

url = "https://openp.ai/v1beta/models/{model}:generateContent"

response = requests.post(url)

print(response.text)
const options = {method: 'POST'};

fetch('https://openp.ai/v1beta/models/{model}:generateContent', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://openp.ai/v1beta/models/{model}:generateContent",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://openp.ai/v1beta/models/{model}:generateContent"

	req, _ := http.NewRequest("POST", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://openp.ai/v1beta/models/{model}:generateContent")
  .asString();
require 'uri'
require 'net/http'

url = URI("https://openp.ai/v1beta/models/{model}:generateContent")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
The Gemini native protocol, supporting multimodal input (image / PDF / audio / video) and function calling.

Request

curl "https://openp.ai/v1beta/models/gemini-3.1-pro-preview:generateContent" \
  -H "x-goog-api-key: $OPENPAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {
        "role": "user",
        "parts": [{"text": "Explain the Fourier transform"}]
      }
    ],
    "generationConfig": {
      "temperature": 0.7,
      "maxOutputTokens": 2048,
      "topP": 0.95
    }
  }'

Path variables

VariableDescription
{model}Gemini model ID, e.g. gemini-3.1-pro-preview

Main fields

FieldTypeDescription
contentsarrayConversation content, role is user / model
systemInstructionobjectSystem prompt
generationConfig.temperaturenumber0-2
generationConfig.topPnumber
generationConfig.topKinteger
generationConfig.maxOutputTokensintegerMaximum output
generationConfig.candidateCountinteger1-8
generationConfig.stopSequencesarray
generationConfig.responseMimeTypestringapplication/json enables structured output
generationConfig.responseSchemaobjectJSON Schema enforcement
generationConfig.thinkingConfigobject{ thinkingBudget: 8000 }
toolsarrayFunction / retrieval tools
toolConfigobjectfunction_calling_config
safetySettingsarraySafety filter levels

parts types

{"role": "user", "parts": [
  {"text": "Look at this image"},
  {"inline_data": {"mime_type": "image/png", "data": "<base64>"}},
  {"file_data": {"mime_type": "application/pdf", "file_uri": "https://..."}}
]}

Response

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [{"text": "The Fourier transform is..."}]
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [...]
    }
  ],
  "promptFeedback": {"safetyRatings": [...]},
  "usageMetadata": {
    "promptTokenCount": 15,
    "candidatesTokenCount": 412,
    "totalTokenCount": 427,
    "cachedContentTokenCount": 0,
    "thoughtsTokenCount": 0
  }
}
finishReason: STOP / MAX_TOKENS / SAFETY / RECITATION / OTHER.

Function calling

{
  "contents": [{"role": "user", "parts": [{"text": "Weather in Beijing"}]}],
  "tools": [{
    "functionDeclarations": [{
      "name": "get_weather",
      "description": "Get weather for a city",
      "parameters": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"]
      }
    }]
  }]
}
The response includes a functionCall:
{
  "candidates": [{
    "content": {"role": "model", "parts": [
      {"functionCall": {"name": "get_weather", "args": {"city": "Beijing"}}}
    ]}
  }]
}
After executing, append a functionResponse:
{"role": "user", "parts": [{
  "functionResponse": {
    "name": "get_weather",
    "response": {"city": "Beijing", "temp": 18, "desc": "clear"}
  }
}]}

Thinking mode

{
  "contents": [{"role": "user", "parts": [{"text": "Prove Goldbach's conjecture"}]}],
  "generationConfig": {
    "thinkingConfig": { "thinkingBudget": 8000 }
  }
}
Or use a model ID with the -thinking suffix: gemini-2.5-pro-thinking.

Structured output

{
  "contents": [{"role": "user", "parts": [{"text": "Return a user JSON"}]}],
  "generationConfig": {
    "responseMimeType": "application/json",
    "responseSchema": {
      "type": "object",
      "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer"}
      },
      "required": ["name", "age"]
    }
  }
}