EN / RUВойтиПолучить API-ключ

RawLine / Документация API

Справочник API

OpenAI-совместимый. Базовый URL https://app.rawline.dev, инференс под /v1. Машиночитаемый двойник: openapi.json. Авторизация: Authorization: Bearer rlk_… на каждом вызове /v1/*. Форма ошибок: {"error":{"type":"<код>","message":"…"}} для инференса, {"ok":false,"error":{"code":"<код>"}} для вызовов кабинета.

Быстрый старт

cURL, обычный запрос

curl https://app.rawline.dev/v1/chat/completions \
  -H "Authorization: Bearer rlk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "Привет!"}],
    "max_tokens": 256,
    "temperature": 0.7
  }'

Python (OpenAI SDK)

# Базовый URL реле + ваш ключ
from openai import OpenAI
client = OpenAI(base_url="https://app.rawline.dev/v1", api_key="rlk_YOUR_KEY")
r = client.chat.completions.create(model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Привет!"}])
print(r.choices[0].message.content)

Node (OpenAI SDK)

// Базовый URL реле + ваш ключ
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://app.rawline.dev/v1", apiKey: "rlk_YOUR_KEY" });
const r = await client.chat.completions.create({ model: "gpt-4o-mini",
  messages: [{ role: "user", content: "Привет!" }] });
console.log(r.choices[0].message.content);

Модели и цены

curl https://app.rawline.dev/v1/models -H "Authorization: Bearer rlk_YOUR_KEY"

Каждая запись содержит id, name, context_length (+ context_source: members = гарантированный минимум среди провайдеров, declared = план оператора), max_output_tokens, supported_parameters, architecture.input_modalities и цены тенанта pricing {prompt, completion} в USD за токен. В списке только обслуживаемые модели: модель, у провайдеров которой нет ключей, скрыта. Модель без цены отвечает 402 price_not_set — задайте цену в дашборде перед вызовом.

Стриминг (SSE)

curl -N https://app.rawline.dev/v1/chat/completions \
  -H "Authorization: Bearer rlk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Привет"}],
       "stream":true, "max_tokens": 64}'

Фреймы — это data: {…} чанки OpenAI, завершаются data: [DONE]. Python:

# Стриминг: печатаем дельты по мере прихода
stream = client.chat.completions.create(model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Привет"}], stream=True)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

Другие диалекты

МаршрутФормат
POST /v1/messagesAnthropic Messages
POST /v1/responsesOpenAI Responses
POST /v1beta/models/*…Gemini :generateContent / :streamGenerateContent

Все декодируются в одно IR, идут через одну цепочку отказоустойчивости и биллингуются один раз. Опциональные заголовки: X-Relay-Preset: <имя> применяет пресет, X-Rawline-Session: <id> задаёт область памяти диалога (изолирована по тенанту).

Кабинет

ВызовПримечания
POST /api/auth/telegramJSON виджета входа. Первый вход выпускает API-ключ (api_key в ответе); позже ключ не возвращается.
GET /v1/balancebalance_usd / hold_usd / spendable_usd + сырая квота.
GET+POST /v1/keys, DELETE /v1/keys/{id}Ключи самообслуживания, максимум 5 живых. Секрет показывается один раз.
POST /v1/topup {"amount_usd": 25}Счёт Heleket → pay_url. Вебхук зачисляет номинал.
GET /v1/invoicesСвои счета, сначала новые, pending включены.
GET /v1/usage?limit=50Свои траты, сначала новые, плюс 30-дневная summary. Строки отозванных ключей сохраняются.
POST /v1/promo/redeem {"code":"…"}Одно погашение на пользователя на код.

Все вызовы кабинета живут на хосте приложения: кабинет.

Ошибки

Инференс (error.type)

HTTPtypeЗначение
400invalid_requestТело — не JSON или диалект не удалось декодировать.
400preset_conflictБандл с привязанным пресетом + X-Relay-Preset вместе.
401authentication_errorОтсутствующий, неизвестный, отозванный или просроченный ключ — одно тело на всех.
402insufficient_balanceХолд превышает доступный остаток. Пополните баланс.
402price_not_setУ модели нет цены оператора. Бесплатно не обслуживается.
403model_not_allowedКлюч ограничен другими моделями.
404no_such_presetНеизвестное имя в X-Relay-Preset.
404model_not_availableСейчас эту модель не обслуживает ни один настроенный провайдер.
422preset_unusableПресет не удалось применить к этому запросу.
429rate_limit_errorБюджет ключа исчерпан (Retry-After выставлен) или провайдер троттлит реле.
502provider_credential_errorАпстрим отклонил ключ реле — проблема оператора, специально отдаётся как 502.
502bad_gateway / api_errorВызов апстрима не удался.
502relay_encoding_errorРеле собрало запрос, который провайдер отклонил.
503no_provider_available / overloaded_errorЗапрос нечем обслужить.
503billing_unavailableХранилище недоступно — отказ вместо небиллингуемого обслуживания.
500relay_configuration_error / cache_errorСбой на стороне оператора, детали в логе реле.

Кабинет (error.code)

HTTPcodeГде
401login_disabled / bad_signature / bad_id / stale / future / missing_hashВход через Telegram
404no_billing_accountОператорский ключ просит кошелёк
409key_limitУже 5 живых ключей
404no_such_keyОтзыв чужого (или несуществующего) ключа
422bad_amountПополнение вне допустимого диапазона
503payments_disabled / payments_not_receivableHeleket не настроен / нет callback-URL
502heleket_error / invoice_not_createdШлюз отклонил счёт
422invalid_code / code_expired / code_exhausted / already_redeemedПогашение промокода

Память диалогов

Отправляйте X-Rawline-Session: <id> (любая строка до 128 символов, по умолчанию default), и реле будет подставлять записанные ответы ассистента между отправляемыми вами сообщениями пользователя: пересылайте свои пользовательские реплики (или всю историю) и пропускайте ответы ассистента — реле их восстановит, и провайдер посчитает меньше повторных токенов. Запрос, несущий только совсем новую реплику, не совпадёт с записанным префиксом и уйдёт как есть. Изоляция по тенанту — сессии никогда не протекают между кошельками. Хранятся только завершённые ответы; оборванный ответ не отравляет последующие ходы.

Лимиты

Бюджеты RPM / TPM / конкурентности на ключ отвечают 429 с Retry-After. Попадания в кэш и присоединения к одиночному полёту не тратят апстрим-токены и не требуют холда. Один процесс на базу данных: лимиты действуют на процесс.