rpek@tech:~/google-api$ cat API.md

🔌 Gemini API прокси

Сервер rpek.tech ходит в Google Gemini за тебя. Два способа: готовый эндпоинт для анализа картинок с JSON-ответом на русском или английском и прозрачный прокси всего Gemini API, с которым работают официальные SDK Google. Ключ Google на стороне сервера, тебе нужен только токен доступа.
Токен выдаётся вручную: напиши @rpek17. Все запросы логируются, лимиты на токен: по умолчанию 30 в минуту и 1000 в день. Текущая модель по умолчанию: gemini-3.6-flash.

Базовый адрес и авторизация

https://rpek.tech/google-api/api

Токен передаётся в заголовке Authorization: Bearer <token>. Также принимаются X-Api-Key, x-goog-api-key и параметр ?key=. CORS открыт, можно звать прямо из браузера, но тогда токен увидят посетители сайта, поэтому лучше ходить с бэкенда.

GET /v1/me проверить токен и лимиты
curl https://rpek.tech/google-api/api/v1/me -H "Authorization: Bearer ТОКЕН"

1. Анализ картинки

POST /v1/analyze

Принимает картинку одним из трёх способов и возвращает структурированное описание (по умолчанию на русском, с lang=en на английском). JPG, PNG, WEBP, GIF, BMP, HEIC до 10 МБ.

СпособКак передать
multipart/form-dataполе image (файл), необязательно question, model, lang
application/json{"image_base64": "...", "question": "...", "model": "...", "lang": "en"}, base64 можно с префиксом data:
по ссылке{"image_url": "https://..."} или поле image_url в форме

question: свой вопрос про картинку, ответ придёт в поле answer. model: имя модели Gemini, если нужна не дефолтная. lang: язык ответа, ru (по умолчанию), en, es, pt или tr; можно передать полем формы, в JSON-теле или в строке запроса ?lang=en. От него же зависит язык текстов ошибок.

curl

curl https://rpek.tech/google-api/api/v1/analyze \
  -H "Authorization: Bearer ТОКЕН" \
  -F "image=@photo.jpg" \
  -F "question=Сколько людей на фото?"

PHP

$ch = curl_init('https://rpek.tech/google-api/api/v1/analyze');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ТОКЕН'],
    CURLOPT_POSTFIELDS => ['image' => new CURLFile('photo.jpg'), 'question' => 'Что это?'],
    CURLOPT_RETURNTRANSFER => true,
]);
$res = json_decode(curl_exec($ch), true);
echo $res['ok'] ? $res['description'] : 'Ошибка: ' . $res['error'];

JavaScript (Node / браузер)

const fd = new FormData();
fd.append('image', fileInput.files[0]);
fd.append('question', 'Что на картинке?');
const res = await fetch('https://rpek.tech/google-api/api/v1/analyze', {
    method: 'POST', headers: { Authorization: 'Bearer ТОКЕН' }, body: fd,
});
const data = await res.json();
console.log(data.title, data.description, data.objects);

Python

import requests
r = requests.post('https://rpek.tech/google-api/api/v1/analyze',
    headers={'Authorization': 'Bearer ТОКЕН'},
    files={'image': open('photo.jpg', 'rb')},
    data={'question': 'Что это за место?'})
print(r.json())

Ответ

{
  "ok": true,
  "model": "gemini-3.6-flash",
  "title": "Рыжий кот на подоконнике",
  "description": "На фото рыжий кот сидит на подоконнике и смотрит в окно...",
  "objects": [{"name": "кот", "count": 1}, {"name": "окно", "count": 1}],
  "tags": ["кот", "животные", "дом", "окно"],
  "text": "",                       // текст с картинки, дословно
  "people": 0,
  "emotions": [],                   // эмоции лиц, если есть люди
  "place": "",                      // место, если определяется
  "colors": [{"name": "рыжий", "hex": "#d2691e"}],
  "type": "фото",                   // фото | скриншот | рисунок | мем | документ | схема | логотип | другое
  "nsfw": false,
  "fun_fact": "...",
  "answer": "",                     // ответ на question
  "tokens": 1800                    // потрачено токенов Gemini
}

С lang=en те же поля, значения на английском, а type один из: photo | screenshot | drawing | meme | document | diagram | logo | other.

При ошибке: {"ok": false, "error": "текст", "error_type": "unauthorized | rate_limited | too_large | unsupported_media | upstream_error | blocked | bad_request"} и соответствующий HTTP-код (401, 429, 413, 415, 502, 400).

2. Прозрачный прокси Gemini API

ANY /v1/gemini/<путь Gemini API>

Всё, что идёт после /v1/gemini/, отправляется на generativelanguage.googleapis.com с серверным ключом. Тело запроса и ответ не меняются, стриминг (alt=sse) работает. Поэтому подходит любой официальный SDK: укажи baseUrl и передай свой токен вместо ключа Google.

curl

curl "https://rpek.tech/google-api/api/v1/gemini/v1beta/models/gemini-3.6-flash:generateContent" \
  -H "Authorization: Bearer ТОКЕН" -H "Content-Type: application/json" \
  -d '{"contents":[{"parts":[{"text":"Привет! Кто ты?"}]}]}'

Python, google-genai

from google import genai
client = genai.Client(api_key='ТОКЕН',
    http_options={'base_url': 'https://rpek.tech/google-api/api/v1/gemini'})
r = client.models.generate_content(model='gemini-3.6-flash', contents='Привет!')
print(r.text)

JavaScript, @google/genai

import { GoogleGenAI } from '@google/genai';
const ai = new GoogleGenAI({ apiKey: 'ТОКЕН',
    httpOptions: { baseUrl: 'https://rpek.tech/google-api/api/v1/gemini' } });
const r = await ai.models.generateContent({ model: 'gemini-3.6-flash', contents: 'Привет!' });
console.log(r.text);

Картинка через прокси (чистый REST)

{
  "contents": [{ "parts": [
    { "inline_data": { "mime_type": "image/jpeg", "data": "<base64>" } },
    { "text": "Что на картинке? Ответь по-русски." }
  ]}]
}

Доступные модели: gemini-3.6-flash (по умолчанию, быстрая), gemini-3.1-pro-preview (умнее и медленнее), gemini-3.1-flash-lite. Список актуальных моделей: GET /v1/gemini/v1beta/models.

Ограничения

  • Лимиты на токен (по умолчанию 30 запросов в минуту, 1000 в день) и общий дневной потолок на сервер. При превышении HTTP 429.
  • Тело запроса до 20 МБ, картинка до 10 МБ.
  • Картинки на сервере не сохраняются. В лог пишутся время, IP, имя клиента, метод, статус и число токенов.
  • Сервис держится на бесплатной квоте Google, без гарантий доступности. Для продакшена с большим трафиком договаривайся отдельно.