API پلتفرم
کاتالوگ، قیمتها، موجودی و مصرف خود را از کد بخوانید.
این همهچیز است بهجز فرستادن پرامپت: کدام مدلها وجود دارند، هر ارائهدهنده چه میگیرد، چقدر خرج کردهاید و چه کلیدهایی دارید. همه روی همان میزبان api که completion میفرستید، JSON جواب میدهند.
نقاط پایانی کاتالوگ و قیمت عمومیاند و هیچ اعتبارنامهای نمیخواهند. هر چیزی درباره حساب خودتان یکی میخواهد؛ و دو نوع است.
جایگزین هم نیستند. کلید API نمیتواند موجودی شما را بخواند و توکن دسترسی نمیتواند completion بفرستد.
| اعتبارنامه | شکلش | باز میکند |
|---|---|---|
| کلید API | sk-... | استنتاج، فهرست مدلها و شمارنده مصرف همان یک کلید. |
| توکن دسترسی | ۲۹ تا ۳۲ نویسه، بدون پیشوند | حساب شما: موجودی، مدیریت کلیدها، لاگهای مصرف. |
هر دو در یک هدر سفر میکنند: Authorization: Bearer بههمراه مقدار. چیز دیگری خوانده نمیشود. مثالهای قدیمیتر هدر New-Api-User را اضافه میکنند که نادیده گرفته میشود و جایگزین کوکی هم وجود ندارد.
حتی جایی که نقطه پایانی بدون هدر جواب میدهد، آن هدر را بفرستید. درخواست به مسیر حسابی بدون اعتبارنامه ممکن است قبل از رسیدن به ما به چالش کشیده شود و چالش، HTML جواب میدهد نه JSON.
باز کنیدتنظیمات، زیر Security گزینه API access را پیدا و یکی بسازید. یک بار نمایش داده میشود. فقط وقتی وارد شدهاید قابل ساخت است؛ پس اسکریپت نمیتواند برای خودش بسازد.
در هر لحظه یک توکن دسترسی دارید. ساخت توکن جدید، قبلی را بیصدا باطل میکند و هر چیزی که هنوز ازش استفاده میکند از کار میافتد.
مثل رمز عبور با آن رفتار کنید. میتواند پول خرج کند، کلید بسازد و تاریخچه شما را بخواند. وقتی اسکریپت دیگر لازمش ندارد، از همان صفحه باطلش کنید.
یک درخواست عمومی همه مدلها را برمیگرداند، با قیمتهایی که از قبل به دلار بر میلیون توکن تبدیل شدهاند. نه کلید، نه ثبتنام.
curl https://api.routerah.app/api/pricing/catalog{
"counts": { "models": 239, "free": 134, "paid": 105, "vendors": 50 },
"first_free_model": "glm-5.3:free",
"vendors": [{ "vendor_id": 4, "vendor_name": "Zhipu", "icon": "Zhipu.Color" }],
"models": [
{
"model_name": "glm-5.3",
"vendor": "Zhipu",
"type": "text",
"is_free": false,
"online": true,
"input_price": 0.05103,
"output_price": 0.160382187,
"original_input_price": 1.26,
"original_output_price": 3.960054,
"tags": "Text,Reasoning,Tools,Cache",
"supported_endpoint_types": ["openai", "anthropic"],
"uptime_24h": 99.965,
"success_rate": 95,
"avg_latency_ms": 11062
}
]
}input_price و output_price همان چیزی است که امروز واقعاً میپردازید — در ارزانترین ارائهدهندهای که همین حالا آن مدل را سرو میکند. original_input_price و original_output_price قیمت فهرست خودِ فروشنده است؛ پس فاصله این دو همان تخفیف است. is_free مدلهایی را که هرگز شارژ نمیکنند و online آنهایی را که همین حالا ارائهدهنده زنده دارند علامت میزند.
دو خویشاوند کوچکتر: /api/pricing/counts فقط جمعها را برمیگرداند و برای poll ارزان است، و /api/pricing/vendors فهرست ارائهدهندگان را میدهد. نقطه پایانی قدیمیتر /api/pricing بهجای دلار نسبت خام برمیگرداند و چند برابر بزرگتر است.
بیشتر مدلها توسط چند ارائهدهنده با نرخهای متفاوت سرو میشوند. برای دیدن همه، یک مدل را درخواست کنید.
curl "https://api.routerah.app/api/pricing/catalog/model?model=glm-5.3"{
"model_name": "glm-5.3",
"model_ratio": 0.63,
"completion_ratio": 3.1429,
"cache_ratio": 0.1857,
"input_price": 0.05103,
"output_price": 0.160382187,
"grid_min_ratio": 0.0405,
"auto_chain": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3", "a7-4069-glm-5.3"],
"group_ratio": {
"a7-bbgt-2846-glm-5.3": 0.0405,
"a7-kkl-3731-glm-5.3": 0.0911,
"a7-4069-glm-5.3": 0.1214
},
"enable_groups": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3"]
}auto_chain ترتیبی است که مسیریابی به ترتیبش امتحان میکند — ارزانترین اول. group_ratio ضریب هر ارائهدهنده را میدهد و قیمت از آن درمیآید:
input $/1M = model_ratio * 2 * group_ratio
output $/1M = input * completion_ratio
cached $/1M = input * cache_ratio
glm-5.3 on a7-bbgt-2846: 0.63 * 2 * 0.0405 = $0.05103 / 1M in
0.05103 * 3.1429 = $0.16038 / 1M outاین نام گروهها همانهایی است که کلید را بهشان سنجاق میکنید، ببینید سنجاق گروه
فهرست سازگار با OpenAI همان است که بیشتر کلاینتها موقع زدن connect صدا میزنند. کلید API میخواهد.
curl https://api.routerah.app/v1/models \
-H "Authorization: Bearer $ROUTERAH_API_KEY"فقط آنچه را آن کلید واقعاً مجاز به استفاده است برمیگرداند؛ پس کلید رایگان، مدلهای کمتری از کلید شارژشده میبیند. هر ورودی context_length و max_output_tokens هم دارد که OpenAI ساده نمیدهد.
مسیر /v1/models است. /v1 را بردارید به صفحه وب میرسید نه API؛ و کلاینتها آن را خطای تجزیه JSON درباره doctype غیرمنتظره گزارش میکنند.
یک فراخوانی حساب شما را برمیگرداند، شامل باقیمانده مصرف.
curl https://api.routerah.app/api/user/self \
-H "Authorization: Bearer $ROUTERAH_ACCESS_TOKEN"{
"success": true,
"message": "",
"data": {
"id": 12345,
"username": "you",
"group": "default",
"quota": 265000,
"used_quota": 4231900,
"request_count": 1884,
"aff_code": "ABC123"
}
}مبالغ به واحد سهمیه است، نه دلار. ۵۰۰٬۰۰۰ واحد یک دلار آمریکاست؛ پس موجودی بالا ۰٫۵۳ دلار است. برای نمایش پول بر ۵۰۰٬۰۰۰ تقسیم کنید.
quota آن چیزی است که هنوز میتوانید خرج کنید. used_quota و request_count جمعهای مادامالعمراند که فقط بالا میروند؛ پس used_quota تفاضل هیچ چیزی با موجودی شما نیست.
کلیدهایتان را فهرست کنید، بعد یکی را با شناسهاش آشکار کنید.
curl "https://api.routerah.app/api/token/?p=1&page_size=20" \
-H "Authorization: Bearer $ROUTERAH_ACCESS_TOKEN"
curl -X POST https://api.routerah.app/api/token/42/key \
-H "Authorization: Bearer $ROUTERAH_ACCESS_TOKEN"فهرستکردن، مقدار همه کلیدها را ماسک میکند؛ برای همین آشکارسازی فراخوانی جداست. آن فراخوانی محدودیت نرخ دارد و در لاگ ردیابی شما ثبت میشود.
ساخت کلید success برمیگرداند اما خود کلید را نه. بسازید، با فهرست شناسهاش را پیدا کنید، بعد آشکارش کنید. بهروزرسانی کلید شیء بهروزشده را برمیگرداند، اما کل شیء را بفرستید: فقط cross_group_retry، group_mapping و auto_groups حذفشدن را تحمل میکنند و هر فیلد دیگری که جا بیندازید، خالی بازنویسی میشود.
تاریخچه درخواستهای خودتان صفحهبندی و فیلترشدنی است.
curl -G https://api.routerah.app/api/log/self \
-H "Authorization: Bearer $ROUTERAH_ACCESS_TOKEN" \
-d p=1 \
-d page_size=100 \
-d type=2 \
-d start_timestamp=1789344000 \
-d model_name=glm-5.3| پارامتر | معنا |
|---|---|
type | ۱ شارژ، ۲ مصرف، ۳ مدیریت، ۵ خطا، ۶ بازپرداخت، ۷ ورود. برای همه، حذفش کنید. |
start_timestamp, end_timestamp | ثانیههای یونیکس. دو مقدار نباید بیش از ده سال فاصله باشند. |
model_name, token_name, group | به یک مدل، یک کلید یا یک گروه ارائهدهنده محدودش کنید. |
request_id, upstream_request_id | یافتن یک درخواست تکی، با شناسه ما یا ارائهدهنده. |
برای صفحهبندی p و page_size اضافه کنید که سقف اندازه صفحه ۱۰۰ است. یک نقطه پایانی خواهر به نام /api/log/self/stat فقط جمعهای همان فیلترها را میدهد: هزینه، درخواست در دقیقه و توکن در دقیقه.
برای خواندن موجودی باقیمانده یک کلید بدون توکن دسترسی، با خودِ کلید احراز هویت کنید:
curl https://api.routerah.app/api/usage/token/ \
-H "Authorization: Bearer $ROUTERAH_API_KEY"{
"object": "token_usage",
"name": "SillyTavern",
"total_granted": 500000,
"total_used": 231900,
"total_available": 268100,
"unlimited_quota": false,
"model_limits_enabled": false,
"expires_at": 0
}نقاط پایانی حساب، payload خودشان را میپوشانند. صفحهبندیشدهها دو بار میپوشانند.
{ "success": true, "message": "", "data": { ... } }
{ "success": true, "message": "", "data": {
"page": 1, "page_size": 20, "total": 137, "items": [ ... ]
} }نقاط پایانی عمومی کاتالوگ استثنائاند و شیءشان را مستقیم و بدون پوشش برمیگردانند.
بیشتر شکستها همچنان HTTP 200 با success=false و پیامی که دلیلش را میگوید جواب میدهند. آن فیلد را بررسی کنید، نه وضعیتکد را.
احراز هویت استثناست و وضعیت واقعی میدهد: 401 با AUTH_UNAUTHORIZED برای اعتبارنامه بد، AUTH_TOKEN_EXPIRED برای منقضی، AUTH_SESSION_REVOKED بعد از خروج، و 403 با AUTH_INSUFFICIENT_PRIVILEGE وقتی حساب اجازه آن مسیر را ندارد.