OpenAI API key example: как ключ используется в curl, Python и Node.js
Готовые примеры передачи API-ключа в заголовке, переменных окружения и SDK, разбор типичных ошибок формата и проверка ключа запросом баланса /v1/balance.
5 мин · · API-ключи · разработка
Ищете OpenAI API key example: как именно ключ попадает в запрос? Ниже короткие рабочие примеры для curl, Python и Node.js, способы хранить ключ в переменных окружения и проверка подключения запросом к /v1/models. Примеры написаны для OpenAI-совместимого формата: ключ fetch_... из кабинета Zukko и адрес https://api.zukko.pro/v1. Тот же код с другим ключом и адресом работает и с другими OpenAI-совместимыми серверами.
Как выглядит ключ и где он используется
Ключ — это строка, которая сообщает серверу, чей это запрос и с чьего баланса списывать деньги. В OpenAI-формате он передаётся в заголовке Authorization со словом Bearer и пробелом перед ключом:
Authorization: Bearer fetch_xxxxxxxxxxxxxxxx
Ключ Zukko начинается с fetch_. Создаётся он в кабинете, и полностью показывается один раз при создании, поэтому сразу сохраните его в менеджере паролей или в переменной окружения. Если потеряли, создайте новый. Подробности авторизации — в справочнике по авторизации.
Запомните одно правило: ключ работает только на том сервере, где выдан. Официальный ключ OpenAI не подойдёт к api.zukko.pro, а ключ fetch_... не подойдёт к серверам OpenAI. Если подставили не тот ключ, получите 401.
Ключ в переменной окружения
Не вставляйте ключ прямо в код: он попадёт в репозиторий. Положите его в переменную окружения.
macOS и Linux:
export OPENAI_API_KEY="fetch_ваш_ключ"
export OPENAI_BASE_URL="https://api.zukko.pro/v1"PowerShell:
$env:OPENAI_API_KEY = "fetch_ваш_ключ"
$env:OPENAI_BASE_URL = "https://api.zukko.pro/v1"Переменные OPENAI_API_KEY и OPENAI_BASE_URL читают официальные OpenAI SDK и многие инструменты, поэтому после этого в коде ключ можно не указывать. Переменная живёт только в текущей сессии терминала; чтобы она сохранялась, добавьте строки в профиль оболочки или используйте файл .env, не забыв внести его в .gitignore.
OpenAI API key curl example
Первый запрос — проверка ключа. GET /v1/balance не генерирует текст и возвращает остаток баланса. Список GET /v1/models для этого не подходит: он открыт и ключ не проверяет:
curl https://api.zukko.pro/v1/balance \
-H "Authorization: Bearer $OPENAI_API_KEY"Если пришёл JSON с остатком баланса, ключ и адрес верны. Теперь запрос на генерацию:
curl https://api.zukko.pro/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6.1-sol",
"messages": [{"role": "user", "content": "Скажи привет одним словом"}]
}'Обратите внимание на кавычки: переменную $OPENAI_API_KEY оболочка раскрывает только внутри двойных кавычек. В одинарных кавычках на сервер уйдёт буквальный текст $OPENAI_API_KEY. Модель gpt-6.1-sol взята из каталога на 18 октября 2026; актуальные имена всегда возвращает /v1/models.
Пример на Python
pip install openaiimport os
import httpx
from openai import OpenAI
client = OpenAI(
base_url="https://api.zukko.pro/v1",
api_key=os.environ["OPENAI_API_KEY"],
)
## Проверка ключа: запрос баланса (SDK для него отдельного метода не имеет)
check = httpx.get(
"https://api.zukko.pro/v1/balance",
headers={"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}"},
)
print(check.status_code, check.json())
response = client.chat.completions.create(
model="gpt-6.1-sol",
messages=[{"role": "user", "content": "Скажи привет одним словом"}],
)
print(response.choices[0].message.content)Если переменные OPENAI_API_KEY и OPENAI_BASE_URL уже заданы, конструктор можно вызвать без аргументов: client = OpenAI().
Пример на Node.js
npm install openaiФайл check.mjs (расширение .mjs позволяет использовать import и await на верхнем уровне):
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.zukko.pro/v1",
apiKey: process.env.OPENAI_API_KEY,
});
const response = await client.chat.completions.create({
model: "gpt-6.1-sol",
messages: [{ role: "user", content: "Скажи привет одним словом" }],
});
console.log(response.choices[0].message.content);Запуск: node check.mjs. Если ключ лежит в файле .env, в Node.js 20.6 и новее его можно подключить флагом node --env-file=.env check.mjs. Ту же логику без SDK даёт встроенный fetch:
const res = await fetch("https://api.zukko.pro/v1/balance", {
headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
});
console.log(res.status, await res.json());Частые ошибки с ключом
Большинство проблем из одного набора:
- Нет слова
Bearerили нет пробела. ЗаголовокAuthorization: fetch_...безBearerдаст 401. - Лишние символы. Пробел, перевод строки или кавычки внутри значения: часто остаются после копирования или чтения из файла. Обрежьте значение (
.strip()в Python,.trim()в JavaScript). - Не тот ключ. Ключ другого сервиса. Сверьте, что строка начинается с
fetch_. - Адрес без
/v1. Для OpenAI-формата base URL должен заканчиваться на/v1; без него получите 404. См. статью base URL с /v1 или без. - Переменная не передалась. В Python
os.environ["OPENAI_API_KEY"]вызоветKeyError, если переменной нет в этой сессии терминала. Откройте новый терминал после изменения профиля. - Ключ в одинарных кавычках в curl. Оболочка не подставит значение (см. выше).
Коды ответов: 401 — неверный ключ, 402 — не хватает баланса, 403 — модель не разрешена для этого ключа (model_not_allowed_for_key), 404 — неизвестная модель или неверный адрес, 429 — исчерпан лимит ключа или ограничение провайдера. Чаще всего встречается 401, и почти всегда причина в одном из пунктов списка выше.
Как хранить ключ безопасно
Пара правил, которые экономят нервы:
- Не коммитьте ключ в git и не вставляйте в код фронтенда: любой посетитель сайта увидит его в браузере. Запросы к API делайте с сервера.
- Заведите отдельные ключи под проекты и задайте каждому дневной и месячный лимит в долларах и список разрешённых моделей. Если один ключ утёк, ущерб ограничен лимитом, а отозвать нужно только его.
- Если ключ попал в публичный репозиторий, считайте его скомпрометированным: создайте новый, старый удалите. Что делать пошагово, описано в статье утёк API-ключ.
Больше практик — в материале безопасность API-ключей.
Частые вопросы
Где взять api key for OpenAI-совместимого API?
Для Zukko: зарегистрируйтесь в кабинете, откройте раздел ключей и создайте ключ. Он показывается один раз. Минимальное пополнение баланса — $1. Для сервера OpenAI ключ выдаётся в аккаунте самого сервиса, и к нашему адресу он не подойдёт.
Можно ли передавать ключ в заголовке x-api-key?
Anthropic SDK шлёт ключ именно так, и это работает. В OpenAI-формате используйте Authorization: Bearer.
Почему запрос баланса проходит, а генерация нет?
Запрос баланса проверяет только ключ. Генерация дополнительно требует баланса (иначе 402), разрешённой для ключа модели (иначе 403) и корректного имени модели (иначе 404). Актуальные имена берите из ответа /v1/models.
Нужно ли что-то менять в коде при переходе на другой сервер?
Только base_url и ключ. Остальной код на OpenAI SDK остаётся прежним. Ссылка для создания ключа и первого запроса — кабинет.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Свой прокси к нейросети на Node.js: не показывать API-ключ во фронтендеНебольшой сервер на Express между вашим фронтендом и API нейросети: ключ остаётся на сервере, а модели, длина запроса и частота ограничены.
- DeepSeek API на Python: запросы, стриминг, JSON и обработка ошибокГотовый код для DeepSeek V4.1 Flash и V4 Pro на OpenAI SDK: запрос, стриминг, разбор JSON и аккуратная обработка ошибок.
- Gemini API на Python: запросы через OpenAI SDK и OpenAI-форматРабочий пример Gemini API на Python без отдельной библиотеки: меняем base_url в OpenAI SDK, добавляем стриминг и JSON и сравниваем с google-genai.
- Anthropic SDK для Python: base_url, ключ и первый запрос через шлюзОфициальный пакет anthropic для Python нужно только направить на другой адрес. Разбираем base_url, ключ, стриминг, подсчёт токенов, кэш и ошибки.