Integrating Google Gemini API in PHP (Generate Content & List Models)

API call to AI Model

We will learn how to connect our PHP project to Google Gemini using two practical scripts:

(1) Generate Content with our chosen model and prompt.
(2) List Models to discover the latest available Gemini models. Both scripts use cURL and a simple settings.php file to keep your API key separate.

Prerequisites


Create a Gemini API Key in Google AI Studio (Step-by-Step)

1) Generate Content with a Gemini Model

Use this script to send a prompt to Gemini and print the response as HTML (safe for direct display). Update the $MODEL and $text as needed.

<?php
require 'settings.php'; // must define: $GOOGLE_API_KEY
$MODEL   = 'gemini-2.5-flash'; // <- update model
$text = " Write a short poem about the stars."; // Update your text

$url = "https://generativelanguage.googleapis.com/v1beta/models/$MODEL:generateContent";

$payload = [
  "contents" => [[
    "parts" => [["text" => $text]]
  ]]
];

$ch = curl_init($url);
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => [
    'Content-Type: application/json',
    "x-goog-api-key: $GOOGLE_API_KEY",
  ],
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_CONNECTTIMEOUT => 10,
  CURLOPT_TIMEOUT => 30,
]);
$res = curl_exec($ch);
if (curl_errno($ch)) {
  die('cURL error: ' . curl_error($ch));
}
curl_close($ch);

$data = json_decode($res, true);
if (isset($data['candidates'][0]['content']['parts'][0]['text'])) {
  echo nl2br(htmlspecialchars($data['candidates'][0]['content']['parts'][0]['text']));
} else {
  // Show full response for debugging
  echo '<pre>'.print_r($data, true).'</pre>';
}
?>

Notes

  • Model choice: gemini-2.5-flash is fast and good for short-form content. Switch to another model if needed.
  • Safety: The output is HTML-escaped via htmlspecialchars() to prevent injection.
  • Prompting: Keep your instructions explicit. You can also include URLs and formatting requirements.
Inside AI Tools: The API Workflow (Restaurant Analogy) #aitools

2) List Available Gemini Models (with Pagination)

This helper lists all models from the ListModels endpoint. It handles pagination and prints a compact HTML table with name, display name/description, and supported generation methods.

<?php
// list-models.php
require 'settings.php'; // must define: $GOOGLE_API_KEY

/**
 * Fetch all models from Gemini ListModels endpoint (handles pagination).
 * @return array Decoded list of models (each item is an associative array)
 */
function fetchAllModels($apiKey) {
  $baseUrl = "https://generativelanguage.googleapis.com/v1beta/models";
  $models  = [];
  $pageTok = null;

  do {
    $url = $baseUrl . ($pageTok ? ("?pageToken=" . urlencode($pageTok)) : "");
    $ch = curl_init($url);
    curl_setopt_array($ch, [
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_HTTPHEADER => [
        "x-goog-api-key: $apiKey",
        "Accept: application/json"
      ],
      CURLOPT_TIMEOUT => 20,
    ]);
    $res = curl_exec($ch);
    if (curl_errno($ch)) {
      throw new RuntimeException('cURL error: ' . curl_error($ch));
    }
    curl_close($ch);

    $data = json_decode($res, true);
    if (isset($data['error'])) {
      throw new RuntimeException("API error: " . ($data['error']['message'] ?? 'unknown'));
    }

    foreach (($data['models'] ?? []) as $m) {
      $models[] = $m;
    }
    $pageTok = $data['nextPageToken'] ?? null;
  } while ($pageTok);

  return $models;
}

try {
  if (empty($GOOGLE_API_KEY)) {
    throw new RuntimeException("Missing GOOGLE_API_KEY in settings.php");
  }

  $models = fetchAllModels($GOOGLE_API_KEY);

  // Simple HTML table output (safe to embed in your admin/tools page)
  echo "<h3>Available Gemini Models</h3>";
  echo "<table border='1' cellpadding='6' cellspacing='0'>";
  echo "<tr><th>Name</th><th>Description</th><th>Generation Methods</th></tr>";

  foreach ($models as $m) {
    $name   = htmlspecialchars($m['name'] ?? '');
    $desc   = htmlspecialchars($m['displayName'] ?? ($m['description'] ?? ''));
    $meth   = htmlspecialchars(implode(', ', $m['supportedGenerationMethods'] ?? []));
    echo "<tr><td><code>{$name}</code></td><td>{$desc}</td><td>{$meth}</td></tr>";
  }
  echo "</table>";

  // Optional: quick JSON dump for debugging
  // echo "<pre>" . htmlspecialchars(json_encode($models, JSON_PRETTY_PRINT)) . "</pre>";

} catch (Throwable $e) {
  http_response_code(500);
  echo "<pre>Error: " . htmlspecialchars($e->getMessage()) . "</pre>";
}
?>

settings.php (Example)

Keep your API key outside version control (use environment variables or server configs). A simple starter:

<?php
// settings.php
$GOOGLE_API_KEY = getenv('GOOGLE_API_KEY') ?: 'YOUR_API_KEY_HERE';
?>

Troubleshooting

  • 401/403: Check API key, quotas, and whether the Gemini API is enabled for your project.
  • Timeouts: Increase CURLOPT_TIMEOUT for long responses.
  • Empty content: Print the raw response (already included) to see error details from the API.
  • Model not found: Run list-models to verify the exact model name and supported generation methods.

Example model-list output

This is a preserved output snapshot from the original tutorial. Model availability changes over time, so run the listing script above for the current result.

NameDescriptionGeneration Methods
models/embedding-gecko-001Embedding GeckoembedText, countTextTokens
models/gemini-2.5-pro-preview-03-25Gemini 2.5 Pro Preview 03-25generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-flash-preview-05-20Gemini 2.5 Flash Preview 05-20generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-flashGemini 2.5 FlashgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-flash-lite-preview-06-17Gemini 2.5 Flash-Lite Preview 06-17generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-pro-preview-05-06Gemini 2.5 Pro Preview 05-06generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-pro-preview-06-05Gemini 2.5 Pro PreviewgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-proGemini 2.5 ProgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-expGemini 2.0 Flash ExperimentalgenerateContent, countTokens, bidiGenerateContent
models/gemini-2.0-flashGemini 2.0 FlashgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-001Gemini 2.0 Flash 001generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-exp-image-generationGemini 2.0 Flash (Image Generation) ExperimentalgenerateContent, countTokens, bidiGenerateContent
models/gemini-2.0-flash-lite-001Gemini 2.0 Flash-Lite 001generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-liteGemini 2.0 Flash-LitegenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-preview-image-generationGemini 2.0 Flash Preview Image GenerationgenerateContent, countTokens, batchGenerateContent
models/gemini-2.0-flash-lite-preview-02-05Gemini 2.0 Flash-Lite Preview 02-05generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-lite-previewGemini 2.0 Flash-Lite PreviewgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-pro-expGemini 2.0 Pro ExperimentalgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-pro-exp-02-05Gemini 2.0 Pro Experimental 02-05generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-exp-1206Gemini Experimental 1206generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-thinking-exp-01-21Gemini 2.5 Flash Preview 05-20generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-thinking-expGemini 2.5 Flash Preview 05-20generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.0-flash-thinking-exp-1219Gemini 2.5 Flash Preview 05-20generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-flash-preview-ttsGemini 2.5 Flash Preview TTScountTokens, generateContent
models/gemini-2.5-pro-preview-ttsGemini 2.5 Pro Preview TTScountTokens, generateContent
models/learnlm-2.0-flash-experimentalLearnLM 2.0 Flash ExperimentalgenerateContent, countTokens
models/gemma-3-1b-itGemma 3 1BgenerateContent, countTokens
models/gemma-3-4b-itGemma 3 4BgenerateContent, countTokens
models/gemma-3-12b-itGemma 3 12BgenerateContent, countTokens
models/gemma-3-27b-itGemma 3 27BgenerateContent, countTokens
models/gemma-3n-e4b-itGemma 3n E4BgenerateContent, countTokens
models/gemma-3n-e2b-itGemma 3n E2BgenerateContent, countTokens
models/gemini-flash-latestGemini Flash LatestgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-flash-lite-latestGemini Flash-Lite LatestgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-pro-latestGemini Pro LatestgenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-flash-liteGemini 2.5 Flash-LitegenerateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-flash-image-previewNano BananagenerateContent, countTokens
models/gemini-2.5-flash-imageNano BananagenerateContent, countTokens
models/gemini-2.5-flash-preview-09-2025Gemini 2.5 Flash Preview Sep 2025generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-2.5-flash-lite-preview-09-2025Gemini 2.5 Flash-Lite Preview Sep 2025generateContent, countTokens, createCachedContent, batchGenerateContent
models/gemini-robotics-er-1.5-previewGemini Robotics-ER 1.5 PreviewgenerateContent, countTokens
models/gemini-2.5-computer-use-preview-10-2025Gemini 2.5 Computer Use Preview 10-2025generateContent, countTokens
models/embedding-001Embedding 001embedContent
models/text-embedding-004Text Embedding 004embedContent
models/gemini-embedding-exp-03-07Gemini Embedding Experimental 03-07embedContent, countTextTokens, countTokens
models/gemini-embedding-expGemini Embedding ExperimentalembedContent, countTextTokens, countTokens
models/gemini-embedding-001Gemini Embedding 001embedContent, countTextTokens, countTokens, asyncBatchEmbedContent
models/aqaModel that performs Attributed Question Answering.generateAnswer
models/imagen-3.0-generate-002Imagen 3.0predict
models/imagen-4.0-generate-preview-06-06Imagen 4 (Preview)predict
models/imagen-4.0-ultra-generate-preview-06-06Imagen 4 Ultra (Preview)predict
models/imagen-4.0-generate-001Imagen 4predict
models/imagen-4.0-ultra-generate-001Imagen 4 Ultrapredict
models/imagen-4.0-fast-generate-001Imagen 4 Fastpredict
models/veo-2.0-generate-001Veo 2predictLongRunning
models/veo-3.0-generate-previewVeo 3predictLongRunning
models/veo-3.0-fast-generate-previewVeo 3 fastpredictLongRunning
models/veo-3.0-generate-001Veo 3predictLongRunning
models/veo-3.0-fast-generate-001Veo 3 fastpredictLongRunning
models/veo-3.1-generate-previewVeo 3.1predictLongRunning
models/veo-3.1-fast-generate-previewVeo 3.1 fastpredictLongRunning
models/gemini-2.0-flash-live-001Gemini 2.0 Flash 001bidiGenerateContent, countTokens
models/gemini-live-2.5-flash-previewGemini Live 2.5 Flash PreviewbidiGenerateContent, countTokens
models/gemini-2.5-flash-live-previewGemini 2.5 Flash Live PreviewbidiGenerateContent, countTokens
models/gemini-2.5-flash-native-audio-latestGemini 2.5 Flash Native Audio LatestcountTokens, bidiGenerateContent
models/gemini-2.5-flash-native-audio-preview-09-2025Gemini 2.5 Flash Native Audio Preview 09-2025countTokens, bidiGenerateContent

All PHP Scripts AI Prompt Generator Generating Social Media Posts through API


Subscribe to our YouTube Channel here



plus2net.com











PHP video Tutorials
✖
We use cookies to improve your browsing experience. . Learn more
HTML MySQL PHP JavaScript ASP Photoshop Articles Contact us
© 2000-2026 plus2net.com All rights reserved worldwide Privacy Policy Disclaimer