مستندات API پی جینگو
یک کلید، همه مدل ها. API پی جینگو با [OI] سازگار است؛ فقط base_url را عوض کنید و با کیف پول تومانی پرداخت کنید.
شروع سریع
کلید را از داشبورد بگیرید، یکی از نمونه ها را اجرا کنید.
from openai import [OI]
client = [OI](
base_url="https://payjingo.com/api/v1",
api_key="sk-payjingo-...",
)
resp = client.chat.completions.create(
model="",
messages=[{"role": "user", "content": "سلام! خودت را معرفی کن."}],
)
print(resp.choices[0].message.content)
print(resp.usage) # توکن های مصرفیاحراز هویت
کلید را در هدر Authorization بفرستید؛ هرگز آن را در کد سمت کلاینت قرار ندهید.
- هدر
Authorization: Bearer sk-payjingo-.... - کلید فقط یک بار هنگام ساخت نمایش داده می شود؛ آن را در متغیر محیطی نگه دارید.
- هر کلید می تواند بودجه ماهانه، تاریخ انقضا، سقف RPM/TPM و لیست مدل های مجاز داشته باشد.
- هزینه از کیف پول حساب شما کسر می شود؛ پیش از هر درخواست موجودی رزرو و بعد از پاسخ بر اساس usage واقعی تسویه می شود.
Endpointها
همه مسیرها زیر base_url قرار می گیرند.
- POST
/chat/completionsچت سازگار با [OI]؛ streaming، tools، json_mode، reasoning_effort - GET
/modelsفهرست مدل های در دسترس این کلید - POST
/embeddingsبرداری کردن متن (embedding) - POST
/images/generationsتولید تصویر - POST
/messagesپاسخ متنی ([OI] Messages API) - POST
/responsesپاسخ متنی ([OI] Responses API) - POST
/audio/speechتبدیل متن به گفتار (TTS) - POST
/audio/transcriptionsتبدیل گفتار به متن (STT) - POST
/audio/voice-changerتغییر صدا - GET
/openapi.jsonمشخصات OpenAPI 3.1
Streaming و usage
با stream: true پاسخ به صورت SSE می آید و در chunk آخر usage گزارش می شود.
data: {"id":"chatcmpl-...","choices":[{"delta":{"content":"سلام"}}]}
data: {"id":"chatcmpl-...","choices":[],"usage":{"prompt_tokens":21,"completion_tokens":48,"total_tokens":69,
"prompt_tokens_details":{"cached_tokens":0},"completion_tokens_details":{"reasoning_tokens":0}}}
data: [DONE]توکن های reasoning مدل های استدلالی به عنوان خروجی محاسبه می شوند. توکن های cached با تعرفه کش (معمولاً ارزان تر) حساب می شوند.
قیمت گذاری
قیمت هر مدل به تومان و به ازای یک میلیون توکن است و در صفحه قیمت ها قابل مشاهده است.
{
"id": "",
"vendor": "anthropic",
"context_window": 200000,
"max_output_tokens": 64000,
"capabilities": ["streaming","tools","vision","cache","json_mode","reasoning"],
"pricing": { "unit": "per_million_tokens", "currency": "IRT",
"input": 17201, "output": 68804, "cache_read": 17201 }
}هزینه هر درخواست = (ورودی × نرخ ورودی + خروجی × نرخ خروجی + کش × نرخ کش) ÷ ۱٬۰۰۰٬۰۰۰
جدول کامل در صفحه قیمت ها.
محدودیت ها
سقف ها در سطح کلید تعریف می شوند و از داشبورد قابل تغییرند.
- محدودیت پیش فرض هر کلید بر اساس RPM و TPM است؛ عبور از آن
429 PJ_RATE_LIMITEDبرمی گرداند. - حداکثر زمان انتظار برای پاسخ مدل ۱۲۰ ثانیه است؛ برای خروجی های طولانی از stream استفاده کنید.
- خطاهای موقت بالادست (503) به طور خودکار تا ۲ بار با backoff تلاش مجدد می شوند.
- هر مدل روی هر ارائه دهنده یک circuit breaker دارد: اگر در ۶۰ ثانیه ۵ خطای 5xx رخ دهد، مسیر ۳۰ ثانیه بسته می شود و درخواست ها به ارائه دهنده جایگزین همان مدل (failover) هدایت می شوند. قیمت همان قیمت مدل درخواستی است. اگر هیچ مسیری در دسترس نباشد
503 PJ_MODEL_UNAVAILABLEبا هدرRetry-Afterبرمی گردد.
Idempotency-Key
برای درخواست های non-stream، تکرار ایمن بدون شارژ مجدد.
- هدر
Idempotency-Key(۱ تا ۲۵۵ کاراکتر، مثلاً UUID) را به/chat/completionsبفرستید. - اگر پاسخ 2xx قبلاً برای همین کلید ذخیره شده باشد، تا ۲۴ ساعت همان پاسخ بدون تماس با مدل و بدون کسر هزینه برمی گردد؛ هدرهای
Idempotent-Replayed: trueوX-Original-Request-IDاضافه می شوند. - درخواست هم زمان با همان کلید →
409 idempotency_in_progress؛ همان کلید با بدنه متفاوت →422 idempotency_key_reused؛ کلید خالی یا بلندتر از ۲۵۵ کاراکتر →400 invalid_idempotency_key. - پاسخ های خطا ذخیره نمی شوند؛ پس تلاش مجدد با همان کلید بعد از خطا مجاز است. در حالت
stream: trueاین هدر نادیده گرفته می شود.
curl https://payjingo.com/api/v1/chat/completions \
-H "Authorization: Bearer $PAYJINGO_API_KEY" \
-H "Idempotency-Key: 5f1c2e9a-7b3d-4c1e-9a2f-0d8e6b4a1c33" \
-H "Content-Type: application/json" \
-d '{"model":"","messages":[{"role":"user","content":"سلام"}]}'کدهای خطا
همه خطاها با ساختار { error: { message, type, code, param, request_id } } برمی گردند.
| کد | HTTP | معنی | راه حل |
|---|---|---|---|
| PJ_INVALID_API_KEY | 401 | کلید نامعتبر یا غیرفعال | هدر Authorization را بررسی کنید |
| PJ_MODEL_NOT_ALLOWED | 403 | کلید به این مدل دسترسی ندارد | مدل های مجاز کلید را ویرایش کنید |
| PJ_INSUFFICIENT_BALANCE | 429 | موجودی کیف پول کافی نیست | کیف پول را شارژ کنید |
| PJ_MONTHLY_BUDGET_EXCEEDED | 429 | سقف مصرف ماهانه کلید تمام شده | سقف کلید را در داشبورد افزایش دهید |
| PJ_RATE_LIMITED | 429 | محدودیت RPM/TPM | با backoff تلاش کنید؛ هدر Retry-After را رعایت کنید |
| PJ_UPSTREAM_RATE_LIMITED | 429 | محدودیت موقت سرویس دهنده بالادست | کمی صبر کنید و دوباره تلاش کنید |
| PJ_INVALID_REQUEST | 400 | بدنه یا درخواست نامعتبر | ساختار messages/پارامترها را بررسی کنید |
| PJ_CONTEXT_TOO_LARGE | 400 | ورودی بزرگ تر از پنجره مدل | متن را کوتاه کنید یا مدل با context بزرگ تر انتخاب کنید |
| PJ_MODEL_UNAVAILABLE | 503 | همه مسیرهای این مدل موقتاً بسته اند (circuit breaker) | بعد از Retry-After تلاش کنید یا مدل دیگری انتخاب کنید |
| PJ_UPSTREAM_TIMEOUT | 504 | مدل پاسخ نداد (timeout) | قابل تلاش مجدد |
| PJ_INTERNAL_ERROR | 500 | خطای داخلی سرویس | بعداً دوباره تلاش کنید |
| idempotency_in_progress | 409 | درخواستی با همین Idempotency-Key در حال پردازش است | کمی صبر کنید و همان درخواست را تکرار کنید |
| idempotency_key_reused | 422 | Idempotency-Key با بدنه متفاوت استفاده شده | برای هر درخواست جدید کلید یکتا بسازید |
| invalid_idempotency_key | 400 | Idempotency-Key باید ۱ تا ۲۵۵ کاراکتر باشد | طول کلید را اصلاح کنید |
ابزارها و IDEها
در هر ابزار سازگار با [OI] فقط base URL و کلید را جایگزین کنید.
Cursor
Settings → Models → [OI] API Key → Override base URL
https://payjingo.com/api/v1Cline / Roo Code
API Provider: [OI] Compatible → Base URL
https://payjingo.com/api/v1Continue.dev
config.json → provider: "openai", apiBase
https://payjingo.com/api/v1Open WebUI
Admin → Connections → [OI] API → URL
https://payjingo.com/api/v1LangChain / LlamaIndex
Chat[OI](base_url=..., api_key=...)
https://payjingo.com/api/v1آمادهٔ اولین درخواست هستید؟
کیف پول را شارژ کنید، یک کلید بسازید و همان نمونهٔ بالا را اجرا کنید.