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),
]);
$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.

Available Gemini Models ( Output of above script )

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
Subhendu Mohapatra — author at plus2net
Subhendu Mohapatra

Author

🎥 Join me live on YouTube

Passionate about coding and teaching, I publish practical tutorials on PHP, Python, JavaScript, SQL, and web development. My goal is to make learning simple, engaging, and project‑oriented with real examples and source code.



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-2025   plus2net.com   All rights reserved worldwide Privacy Policy Disclaimer