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:

bash
export OPENAI_API_KEY="fetch_ваш_ключ"
export OPENAI_BASE_URL="https://api.zukko.pro/v1"

PowerShell:

bash
$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 для этого не подходит: он открыт и ключ не проверяет:

bash
curl https://api.zukko.pro/v1/balance \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Если пришёл JSON с остатком баланса, ключ и адрес верны. Теперь запрос на генерацию:

bash
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

bash
pip install openai
bash
import 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

bash
npm install openai

Файл check.mjs (расширение .mjs позволяет использовать import и await на верхнем уровне):

bash
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:

bash
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, и почти всегда причина в одном из пунктов списка выше.

Как хранить ключ безопасно

Пара правил, которые экономят нервы:

  1. Не коммитьте ключ в git и не вставляйте в код фронтенда: любой посетитель сайта увидит его в браузере. Запросы к API делайте с сервера.
  2. Заведите отдельные ключи под проекты и задайте каждому дневной и месячный лимит в долларах и список разрешённых моделей. Если один ключ утёк, ущерб ограничен лимитом, а отозвать нужно только его.
  3. Если ключ попал в публичный репозиторий, считайте его скомпрометированным: создайте новый, старый удалите. Что делать пошагово, описано в статье утёк 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.

OpenAI API key example: curl, Python, Node.js · Zukko