ToAPIsToAPIs
API-ключи

Создать API-ключ

Создает обычный ключ модели своего аккаунта

POST
/api/v1/api-keys

Для пользователей из материкового Китая: используйте https://api.toapis.cn в качестве эндпоинта (Base URL). Замените https://api.toapis.com на https://api.toapis.cn во всех примерах этого документа.

Поведение

Создаёт новый модельный ключ для вызова генеративных API. При успехе возвращает HTTP 201 и полный секрет: секрет появляется только в этом ответе, поздние GET его не возвращают — сохраните его сразу. Новый ключ использует базовую группу аккаунта.

Выбрать группу, кросс-групповые повторы или webhook-конфигурацию нельзя. Начальная квота — лимит вызовов ключа, а не предоплата из баланса аккаунта.

Поля сумм принимают только неотрицательные десятичные строки, точно конвертируемые в целые внутренние единицы квоты — дробная часть не усекается автоматически. На аккаунт не более 10000 неудалённых ключей, при превышении — 409 (code=13004).

Создание не идемпотентно: при потере ответа сначала проверьте список ключей, а не пересылайте запрос. Если ключ создан, но секрет не сохранён, получите новый через ротацию.

Аутентификация

Authorizationstringзаголовокобязательно

Используйте Bearer YOUR_SYSTEM_ACCESS_TOKEN. Ключ модели не подходит, X-User-Id не нужен. См. правила доступа.

Параметры запроса

Непустое тело требует Content-Type: application/json и ограничено 16384 байтами. Верхний уровень должен быть JSON-объектом. Неизвестные и повторные поля, а также query-параметры отклоняются. Срок чтения тела записи составляет 10 секунд.

namestringтелообязательно

Обязательно после удаления крайних пробелов, максимум 50 байт UTF-8.

expires_atstring | nullтело

Будущее время RFC 3339, дробные секунды округляются вверх. null или пропуск при создании означает бессрочно; пропуск при обновлении сохраняет значение.

unlimitedbooleanтелопо умолчанию: false

По умолчанию false, null не принимается. При true remaining_credits нужно пропустить или передать null; значение дает 400.

remaining_creditsstringтелопо умолчанию: 0

Начальный остаток credits, по умолчанию строка "0".

daily_limit_creditsstring | nullтело

Дневной лимит credits, null или строка "0" снимают лимит.

monthly_limit_creditsstring | nullтело

Месячный лимит credits, null или строка "0" снимают лимит.

model_limitsarrayтелопо умолчанию:

Массив ID моделей, по умолчанию []. Непустой включает ограничения. Элементы после обрезки не пусты и без запятых, дубликаты удаляются с сохранением первого порядка; объединённая длина не более 1024 байт UTF-8.

allow_ipsarrayтелопо умолчанию:

Список IP источника только для этого ключа модели. Массив отдельных IPv4/IPv6 адресов с удалением пробелов, нормализацией и удалением повторов. [] снимает ограничение; null и неверный адрес дают 400. CIDR, имена хостов, порты и IPv6 zone не поддерживаются.

Примеры запросов

Пример запроса

curl --request POST \
  --url 'https://api.toapis.com/api/v1/api-keys' \
  --header 'Authorization: Bearer YOUR_SYSTEM_ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{"name": "Example Key", "expires_at": "2027-01-01T00:00:00Z", "unlimited": false, "remaining_credits": "500", "daily_limit_credits": null, "monthly_limit_credits": null, "model_limits": ["example-image-model"]}'
import requests

response = requests.post(
    "https://api.toapis.com/api/v1/api-keys",
    headers={"Authorization": "Bearer YOUR_SYSTEM_ACCESS_TOKEN"},
    json={'name': 'Example Key', 'expires_at': '2027-01-01T00:00:00Z', 'unlimited': False, 'remaining_credits': '500', 'daily_limit_credits': None, 'monthly_limit_credits': None, 'model_limits': ['example-image-model']},
    timeout=30,
)
response.raise_for_status()
print(response.json())
const response = await fetch("https://api.toapis.com/api/v1/api-keys", {
  method: "POST",
  headers: { Authorization: "Bearer YOUR_SYSTEM_ACCESS_TOKEN", "Content-Type": "application/json" },
  body: JSON.stringify({"name": "Example Key", "expires_at": "2027-01-01T00:00:00Z", "unlimited": false, "remaining_credits": "500", "daily_limit_credits": null, "monthly_limit_credits": null, "model_limits": ["example-image-model"]}),
  signal: AbortSignal.timeout(30_000),
});
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}
console.log(await response.json());

Поля ответа

Примеры содержат вымышленные данные. Метаданные описаны в деталях ключа, общий контракт и ошибки в подключении.

data.keystring

Полный секрет с префиксом sk-, доступный только в этом ответе создания или замены.

Примеры ответов

Пример ответа

{
  "code": 0,
  "message": "",
  "data": {
    "id": "43",
    "name": "Example Key",
    "key_hint": "****xyz9",
    "status": "enabled",
    "created_at": "2026-11-01T08:00:00Z",
    "expires_at": "2027-01-01T00:00:00Z",
    "unlimited": false,
    "remaining_credits": "500",
    "daily_limit_credits": null,
    "monthly_limit_credits": null,
    "key": "sk-example00000000000000000000000000000000000000xyz9",
    "model_limits": [
      "example-image-model"
    ],
    "allow_ips": []
  }
}