DEVELOPER PORTAL
Документация API
Подключите приложения к API DrakeAPI. Выберите совместимый протокол и используйте только модели, доступные вашему ключу.
https://drakezakuru.com/v1
Используйте этот адрес как base_url в SDK.
РАЗДЕЛ
Быстрый старт
Адрес API, ключ и первый запрос.
- Создайте API-ключ в кабинете. Секрет показывается только при создании. Сохраните его локально в переменной окружения
DRAKE_API_KEY. - Получите список моделей. Выполните запрос ниже с тем же активным ключом.
- Отправьте chat-запрос. Выберите из списка модель, совместимую с Chat Completions, и подставьте её
idвместоMODEL_ID_FROM_V1_MODELSв примере чата.
Не каждая модель из списка поддерживает чат. Проверьте совместимость в каталоге моделей.
Запустите пример в своём терминале с переменной окружения DRAKE_API_KEY. Не вводите секрет на этой странице.
curl "https://drakezakuru.com/v1/models" \
-H "Authorization: Bearer $DRAKE_API_KEY"{
"object": "list",
"data": [
{
"id": "<available-model-id>",
"object": "model",
"owned_by": "<provider>"
}
]
}Это иллюстрация, а не результат запроса. Список может быть пустым; состав зависит от ключа и его группы доступа.
РАЗДЕЛ
Аутентификация
Bearer, заголовки и формат API-ключа.
Заголовки и ключи
Для OpenAI-совместимых запросов используйте Authorization: Bearer <API_KEY>. Шлюз также принимает ключ в заголовках x-api-key, api-key и x-goog-api-key. Для Messages используйте x-api-key и заголовок версии Anthropic.
Новые ключи создаются с префиксом sk-drake-; сервер хранит хеш, а полный секрет показывается только при создании. Не помещайте его в URL и не отправляйте в клиентскую аналитику.
РАЗДЕЛ
Chat Completions
OpenAI-совместимый чат endpoint и формат ответа.
POST /v1/chat/completions принимает JSON-объект с доступным model и массивом messages. В примере также используется max_tokens; допустимый диапазон выходного лимита шлюза — от 1 до 131 072.
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/chat/completions" \
-H "Authorization: Bearer $DRAKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL_ID_FROM_V1_MODELS","messages":[{"role":"user","content":"Say hello briefly."}],"max_tokens":128}'
# Форма ответа (текст и идентификаторы выдаются моделью):
# {"id":"<completion-id>","object":"chat.completion","model":"<model-id>",
# "choices":[{"index":0,"message":{"role":"assistant","content":"<generated text>"},"finish_reason":"stop"}],
# "usage":{"prompt_tokens":<number>,"completion_tokens":<number>,"total_tokens":<number>}}import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["DRAKE_API_KEY"], base_url='https://drakezakuru.com/v1')
response = client.chat.completions.create(
model="MODEL_ID_FROM_V1_MODELS",
messages=[{"role": "user", "content": "Say hello briefly."}],
max_tokens=128,
)
print(response.choices[0].message.content)
# Ответ — ChatCompletion с choices[].message и usage.prompt_tokens / completion_tokens.import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.DRAKE_API_KEY,
baseURL: 'https://drakezakuru.com/v1',
});
const response = await client.chat.completions.create({
model: "MODEL_ID_FROM_V1_MODELS",
messages: [{ role: "user", content: "Say hello briefly." }],
max_tokens: 128,
});
console.log(response.choices[0]?.message.content);
// Ответ: object="chat.completion", choices[].message и usage.Ответ сохраняет формат Chat Completions: choices[].message и usage. Сгенерированный текст, идентификаторы и значения токенов динамические.
Для reasoning-моделей задавайте max_tokens с запасом 200–500 токенов: иначе ответ уходит в reasoning_content, а content остаётся пустым при finish_reason length.
РАЗДЕЛ
Responses
Responses API: input, output и JSON-ответ.
POST /v1/responses принимает Responses API-поля, например model, input и max_output_tokens. Используйте идентификатор модели, доступный ключу.
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/responses" \
-H "Authorization: Bearer $DRAKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL_ID_FROM_V1_MODELS","input":"Say hello briefly.","max_output_tokens":128}'
# Форма ответа Responses API:
# {"id":"<response-id>","object":"response","status":"completed",
# "model":"<model-id>","output":[{"type":"message","role":"assistant",
# "content":[{"type":"output_text","text":"<generated text>"}]}]}import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["DRAKE_API_KEY"], base_url='https://drakezakuru.com/v1')
response = client.responses.create(
model="MODEL_ID_FROM_V1_MODELS",
input="Say hello briefly.",
max_output_tokens=128,
)
print(response.output_text)
# Ответ: object="response", status="completed", output[].content[].text.import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.DRAKE_API_KEY,
baseURL: 'https://drakezakuru.com/v1',
});
const response = await client.responses.create({
model: "MODEL_ID_FROM_V1_MODELS",
input: "Say hello briefly.",
max_output_tokens: 128,
});
console.log(response.output_text);
// Ответ: object="response", status="completed", output[].content[].text.Успешный ответ имеет формат Responses API: object: response, состояние и элементы output. Состав содержимого зависит от запроса и модели.
РАЗДЕЛ
Messages (Anthropic)
Anthropic Messages endpoint и заголовки.
POST /v1/messages — Anthropic Messages-совместимый маршрут. Запрос содержит model, max_tokens и массив messages; используйте заголовки x-api-key и anthropic-version.
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/messages" \
-H "x-api-key: $DRAKE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL_ID_FROM_V1_MODELS","max_tokens":128,"messages":[{"role":"user","content":"Say hello briefly."}]}'
# Форма ответа Anthropic Messages:
# {"id":"<message-id>","type":"message","role":"assistant","model":"<model-id>",
# "content":[{"type":"text","text":"<generated text>"}],"stop_reason":"end_turn",
# "usage":{"input_tokens":<number>,"output_tokens":<number>}}import json
import os
from urllib.request import Request, urlopen
body = {
"model": "MODEL_ID_FROM_V1_MODELS",
"max_tokens": 128,
"messages": [{"role": "user", "content": "Say hello briefly."}],
}
request = Request(
'https://drakezakuru.com/v1' + "/messages",
data=json.dumps(body).encode(),
headers={"x-api-key": os.environ["DRAKE_API_KEY"],
"anthropic-version": "2023-06-01", "Content-Type": "application/json"},
)
with urlopen(request) as response:
result = json.load(response)
print(result["content"])
# Для Messages используется Anthropic-формат: content[].text и usage.const response = await fetch('https://drakezakuru.com/v1' + "/messages", {
method: "POST",
headers: {
"x-api-key": process.env.DRAKE_API_KEY!,
"anthropic-version": "2023-06-01",
"content-type": "application/json",
},
body: JSON.stringify({
model: "MODEL_ID_FROM_V1_MODELS",
max_tokens: 128,
messages: [{ role: "user", content: "Say hello briefly." }],
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = await response.json();
console.log(result.content);
// Ответ: type="message", content[].text и usage.Python-пример использует стандартную библиотеку HTTP: OpenAI SDK-примеры выше относятся к Chat Completions и Responses, а здесь показан отдельный Anthropic-совместимый протокол.
Для приблизительного подсчёта входных токенов код также регистрирует POST /v1/messages/count_tokens с JSON-полем messages. При выключенной функции он отвечает 404; этот вызов не тарифицируется.
РАЗДЕЛ
Модели
Доступные модели через GET /v1/models и каталог цен.
GET /v1/models требует действующий API-ключ и возвращает список моделей, видимый именно этому ключу. Результат может быть ограничен разрешёнными моделями, провайдером и группой доступа. Ответ содержит массив data с полями id, object и owned_by.
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/models" -H "Authorization: Bearer $DRAKE_API_KEY"
# Ответ: {"object":"list","data":[{"id":"<available-model-id>",
# "object":"model","owned_by":"<provider>"}]}.
# Состав каталога зависит от API-ключа и его группы.import json
import os
from urllib.request import Request, urlopen
request = Request('https://drakezakuru.com/v1' + "/models",
headers={"Authorization": "Bearer " + os.environ["DRAKE_API_KEY"]})
with urlopen(request) as response:
models = json.load(response)["data"]
print([model["id"] for model in models])
# GET /v1/models возвращает объект списка с полями id, object и owned_by.const response = await fetch('https://drakezakuru.com/v1' + "/models", {
headers: { Authorization: `Bearer ${process.env.DRAKE_API_KEY}` },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { data } = await response.json();
console.log(data.map((model: { id: string }) => model.id));
// data содержит модели, разрешённые для этого ключа.Текущий каталог и цены смотрите на странице Модели и цены. Стоимость и доступность не фиксируются в документации и зависят от настроек.
В /v1/models перечислены канонические ID с префиксом провайдера. Короткие имена работают как алиасы, но могут не отображаться в списке. jb-модели — тот же маршрут, а не отдельная модель.
РАЗДЕЛ
JEV: классификация текста
POST /v1/classify — zero-shot разметка по вашим меткам.
POST /v1/classify — zero-shot разметка текста по вашим меткам. Модель одна: jev; поле model можно не передавать.
| Поле | Тип | Описание |
|---|---|---|
inputs | string[] | 1…1000 непустых текстов. |
labels | string[] | Непустой список меток. |
model | string | Необязательно; по умолчанию jev. |
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/classify" \
-H "Authorization: Bearer $DRAKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"jev","inputs":["Win a free iPhone","Your order has shipped"],"labels":["spam","not spam"]}'
# Response:
# {"results":[{"label":"spam","confidence":0.98},{"label":"not spam","confidence":0.91}]}import os, requests
r = requests.post(os.environ["DRAKE_BASE_URL"] + "/classify",
headers={"Authorization": "Bearer " + os.environ["DRAKE_API_KEY"]},
json={"model": "jev",
"inputs": ["Win a free iPhone", "Your order has shipped"],
"labels": ["spam", "not spam"]})
for row in r.json()["results"]:
print(row["label"], row["confidence"])const base = process.env.DRAKE_BASE_URL!;
const res = await fetch(`${base}/classify`, {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.DRAKE_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "jev",
inputs: ["Win a free iPhone", "Your order has shipped"],
labels: ["spam", "not spam"]
})
});
console.log((await res.json()).results);Ответ содержит results в том же порядке, что и inputs; каждый элемент — label и confidence.
Лимиты: до 1000 текстов за запрос. Пустые inputs или labels → 400; нет ключа → 401. Стоимость — по тарифу classify в настройках сайта; при нулевом тарифе запрос бесплатный.
РАЗДЕЛ
ElevenLabs: TTS и STT
POST /v1/audio/speech и /v1/audio/transcriptions — озвучка и распознавание речи.
POST /v1/audio/speech — озвучка текста (TTS), POST /v1/audio/transcriptions — распознавание речи (STT). Оба маршрута OpenAI-совместимы и работают через мост ElevenLabs.
TTS: /v1/audio/speech
Поля: model, input (до ~5000 символов), voice, response_format (mp3, opus, pcm, wav, ulaw), speed 0.7…1.2 и stream.
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/audio/speech" \
-H "Authorization: Bearer $DRAKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs/eleven_flash_v2_5","input":"Hello from DrakeAPI","voice":"nova","response_format":"mp3"}' \
-o speech.mp3import os, requests
r = requests.post(os.environ["DRAKE_BASE_URL"] + "/audio/speech",
headers={"Authorization": "Bearer " + os.environ["DRAKE_API_KEY"]},
json={"model": "elevenlabs/eleven_flash_v2_5",
"input": "Hello from DrakeAPI",
"voice": "nova",
"response_format": "mp3"})
open("speech.mp3", "wb").write(r.content)import { writeFileSync } from "node:fs";
const base = process.env.DRAKE_BASE_URL!;
const res = await fetch(`${base}/audio/speech`, {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.DRAKE_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "elevenlabs/eleven_flash_v2_5",
input: "Hello from DrakeAPI",
voice: "nova",
response_format: "mp3"
})
});
writeFileSync("speech.mp3", Buffer.from(await res.arrayBuffer()));STT: /v1/audio/transcriptions
Multipart-поля: file (обязательно), model, language, response_format (json или verbose_json).
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/audio/transcriptions" \
-H "Authorization: Bearer $DRAKE_API_KEY" \
-F "model=elevenlabs/scribe_v1" \
-F "[email protected]"import os, requests
r = requests.post(os.environ["DRAKE_BASE_URL"] + "/audio/transcriptions",
headers={"Authorization": "Bearer " + os.environ["DRAKE_API_KEY"]},
data={"model": "elevenlabs/scribe_v1"},
files={"file": open("speech.mp3", "rb")})
print(r.json()["text"])import { readFileSync } from "node:fs";
const base = process.env.DRAKE_BASE_URL!;
const form = new FormData();
form.append("model", "elevenlabs/scribe_v1");
form.append("file", new Blob([readFileSync("speech.mp3")]), "speech.mp3");
const res = await fetch(`${base}/audio/transcriptions`, {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.DRAKE_API_KEY}` },
body: form
});
console.log((await res.json()).text);Модели и голоса
TTS: eleven_flash_v2_5 (по умолчанию), eleven_turbo_v2_5, eleven_multilingual_v2, eleven_v3, eleven_flash_v2, eleven_turbo_v2. STT: scribe_v1, scribe_v2. OpenAI-алиасы: tts-1, tts-1-hd, gpt-4o-mini-tts, whisper-1.
Голоса: alloy, echo, fable, onyx, nova, shimmer или любой voice_id ElevenLabs.
Лимиты и оплата
TTS принимает до 5000 символов за запрос (eleven_v3 — до 3000). Более длинный текст отклоняется с 400 — делите его на части.
speed— только 0.7…1.2;flac/aacтребуют Pro-план ElevenLabs.- STT: слишком короткий файл может вернуть
400 audio_too_short.
TTS тарифицируется за 1000 символов. Доступность оплаты бонусом зависит от модели и настроек кошелька; актуальную цену смотрите в каталоге.
Очень длинная генерация может упереться в 100-секундный таймаут Cloudflare (524); делите текст на части.
РАЗДЕЛ
Потоковая передача
Потоковые ответы и Server-Sent Events.
Для Chat Completions включите stream: true. При доступности потоковой выдачи шлюз передаёт ответ как text/event-stream; формат событий соответствует выбранному протоколу и может отличаться у Chat Completions, Responses и Messages.
BASE_URL='https://drakezakuru.com/v1'
curl -N "$BASE_URL/chat/completions" \
-H "Authorization: Bearer $DRAKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL_ID_FROM_V1_MODELS","messages":[{"role":"user","content":"Say hello briefly."}],"stream":true}'
# Поток — SSE. Для Chat Completions фрагменты имеют choices[].delta;
# маркер завершения и дополнительные поля зависят от совместимого upstream.import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["DRAKE_API_KEY"], base_url='https://drakezakuru.com/v1')
stream = client.chat.completions.create(
model="MODEL_ID_FROM_V1_MODELS",
messages=[{"role": "user", "content": "Say hello briefly."}],
stream=True,
)
for chunk in stream:
text = chunk.choices[0].delta.content
if text:
print(text, end="", flush=True)
# Chat Completions передаёт текст по частям в choices[].delta.content.import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.DRAKE_API_KEY, baseURL: 'https://drakezakuru.com/v1' });
const stream = await client.chat.completions.create({
model: "MODEL_ID_FROM_V1_MODELS",
messages: [{ role: "user", content: "Say hello briefly." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta.content ?? "");
}
// Ответ приходит событиями SSE; структура зависит от выбранного протокола.Поток чата передаёт текстовые части в choices[].delta. Для другого протокола используйте его собственный формат событий; не разбирайте все потоки как один универсальный JSON-объект.
РАЗДЕЛ
Ошибки
Форматы ошибок и HTTP-статусы.
Для шлюзовых OpenAI-совместимых ошибок используется объект error с полями message, type и code (код может быть null). На маршруте Messages тело соответствует Anthropic: type: error и вложенный объект error.
| Статус | Причина |
|---|---|
400 | Некорректный JSON или тело запроса, отсутствующая модель либо недопустимый лимит токенов. |
401 | Ключ отсутствует, не найден, отозван или просрочен. |
402 | Недостаточный баланс либо достигнут бюджет ключа. |
403 | Ограничение доступа, например IP-адрес не разрешён ключу. |
404 | Модель не найдена или дополнительный endpoint выключен. |
429 | Превышен RPM, групповое ограничение или применимая квота. |
502 / 503 | Сбой соединения с upstream или временно недоступный маршрут. Ответы 5xx upstream также могут быть возвращены клиенту. |
Проверяйте HTTP-статус и тело ответа. При временной ошибке повторяйте запрос с задержкой; не повторяйте автоматически ошибку авторизации или недостатка средств.
РАЗДЕЛ
Лимиты
RPM, ключевые бюджеты и настраиваемые квоты.
Ограничения задаются политикой ключа, группы и аккаунта; они могут различаться между пользователями.
- RPM. Для ключа и группы может быть установлен лимит запросов в минуту. Для ключа проверяется скользящее 60-секундное окно.
- Бюджет ключа. Ограничение расходов в USD и срок действия проверяются до проксирования.
- Доступ к моделям и IP. Ключ может иметь allowlist моделей или IP; каталог моделей учитывает эти ограничения.
- Квоты аккаунта. Администратор может включить окна расходов 1 час, 24 часа и 7 дней, а также подписочную квоту. Для бесплатных моделей может применяться настраиваемый дневной лимит.
Лимит расходов задаётся на ключе в кабинете. Если лимит не задан, GET /v1/usage возвращает null в limit_usd и remaining_usd.
GET /v1/usage показывает агрегаты за 5h, 1d и 7d; это периоды статистики ключа, они сами по себе не означают, что соответствующие квоты включены.
РАЗДЕЛ
Биллинг и баланс
Расчёт стоимости, кошелёк и статистика ключа.
Стоимость рассчитывается сервером по фактическому использованию и настроенным тарифам модели; при наличии тарифов учитываются входные и выходные токены и отдельно тарифицируемые cache read/write. Для группы может применяться собственный коэффициент. Цены меняются вместе с настройками — актуальные значения смотрите в каталоге цен.
Запросы с оплатой требуют доступного баланса, бонусных средств или применимого разрешённого режима. Недостаток средств возвращает 402; шлюз резервирует сумму до upstream-запроса и завершает расчёт по возвращённому использованию. Баланс аккаунта смотрите в биллинге.
Расход и лимит API-ключа
GET /v1/usage принимает ключ теми же заголовками, что и inference, и возвращает статус ключа, расходы, бюджет, срок действия, агрегаты за 5 часов / 1 день / 7 дней, сегодняшнюю статистику и дневной ряд за последние семь дней. Он не возвращает баланс аккаунта. Endpoint может быть выключен и ограничивается по частоте.
BASE_URL='https://drakezakuru.com/v1'
curl "$BASE_URL/usage" -H "Authorization: Bearer $DRAKE_API_KEY"
# Ответ начинается с object="usage" и содержит status, spent_usd, limit_usd,
# remaining_usd, expires_at, окна 5h/1d/7d, today и массив daily.import json
import os
from urllib.request import Request, urlopen
request = Request('https://drakezakuru.com/v1' + "/usage",
headers={"Authorization": "Bearer " + os.environ["DRAKE_API_KEY"]})
with urlopen(request) as response:
usage = json.load(response)
print(usage["status"], usage["spent_usd"], usage["windows"])
# GET /v1/usage возвращает статистику ключа, не баланс аккаунта.const response = await fetch('https://drakezakuru.com/v1' + "/usage", {
headers: { Authorization: `Bearer ${process.env.DRAKE_API_KEY}` },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const usage = await response.json();
console.log(usage.status, usage.spent_usd, usage.windows);
// GET /v1/usage возвращает статистику ключа, не баланс аккаунта.Успешный ответ имеет object: usage; status может быть active, disabled, expired или quota_reached. Вложенные агрегаты соответствуют доступным данным ключа.