مستندات توسعهدهندگان
راهنمای یکپارچهسازی با API. فهرست کامل نقاط پایانی در مرجع API آمده است.
شروع سریع
در کنسول توسعهدهندگان یک پروژه و کلید API بسازید. کلید فقط یک بار نمایش داده میشود؛ آن را بهصورت محرمانه روی سرور نگه دارید و هرگز در مرورگر یا برنامه موبایل قرار ندهید.
فهرست مدلهای در دسترس کلید را بگیرید و نخستین درخواست را بفرستید.
export API_KEY=sk_live_...
curl https://gapze.ir/v1/models -H "Authorization: Bearer $API_KEY"
curl https://gapze.ir/v1/responses \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"model":"MODEL_SLUG","input":"Write a haiku about Tehran"}'احراز هویت
کلید را در سرآیند Authorization بهصورت Bearer (یا در X-API-Key) بفرستید. درخواست بدون کلید معتبر پاسخ ۴۰۱ و کلید فاقد دامنه دسترسی لازم پاسخ ۴۰۳ میگیرد.
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxx
# or
X-API-Key: sk_live_xxxxxxxxxxxxxxxxxxxxپاسخ جریانی
با "stream": true رویدادهای سمت سرور (SSE) دریافت میکنید. هر رویداد بخشی از پاسخ است و جریان با [DONE] پایان مییابد. تولیدهایی که با /v1/generations آغاز شوند با Last-Event-ID قابل ادامهاند.
curl -N https://gapze.ir/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"model":"MODEL_SLUG","stream":true,"messages":[{"role":"user","content":"Hi"}]}'
# data: {"choices":[{"delta":{"content":"Hel"}}]}
# ...
# data: [DONE]خطاها
خطاها یک قالب JSON واحد دارند: کد پایدار ماشینخوان، پیام قابلفهم، نوع خطا، اینکه تلاش دوباره کمک میکند یا نه و شناسه درخواست. هنگام تماس با پشتیبانی شناسه درخواست را ذکر کنید.
۴۰۲ یعنی موجودی یا بودجه کافی نیست؛ ۴۰۹ تعارض وضعیت؛ ۴۲۲ ورودی نامعتبر؛ ۴۲۹ محدودیت نرخ؛ ۵xx خطای موقت.
{
"error": {
"code": "insufficient_budget",
"message": "your balance is not enough for this request",
"type": "billing_error",
"retryable": false,
"request_id": "req_01..."
}
}محدودیت نرخ
محدودیتها برای هر کلید و هر پروژه اعمال میشوند. پاسخ ۴۲۹ سرآیند Retry-After بر حسب ثانیه دارد؛ دستکم همین مدت صبر کنید و ترجیحاً با تأخیر نمایی و تصادفی تلاش کنید.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 6000کلید یکتایی (Idempotency)
برای درخواستهایی که چیزی میسازند یا هزینه دارند سرآیند Idempotency-Key یکتا بفرستید. تکرار با همان کلید نتیجه اصلی را برمیگرداند و هرگز دو بار هزینه کسر نمیشود.
curl https://gapze.ir/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: 3f1c2a6e-8b9d-4c1f-9e2a-7d5b6c4a3f21" ...موجودی، پیشفاکتور و مصرف
مصرف از کیف پول مالک کلید کسر میشود. پیش از کارهای پرهزینه پیشفاکتور قطعی بگیرید و هر زمان موجودی و مصرف خود را بخوانید.
curl https://gapze.ir/v1/balance -H "Authorization: Bearer $API_KEY"
curl "https://gapze.ir/v1/usage?from=2026-10-01" -H "Authorization: Bearer $API_KEY"
curl https://gapze.ir/v1/generations/quotes -H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" -d '{"model":"MODEL_SLUG","messages":[...]}'فایلها
فایلها را برای استفاده بهعنوان ورودی بارگذاری کنید. فایلهای کوچک با یک درخواست multipart و فایلهای بزرگ با بارگذاری چندبخشی قابلادامه.
curl https://gapze.ir/v1/files -H "Authorization: Bearer $API_KEY" \
-F purpose=assistants -F file=@report.pdf
# large files: POST /v1/files/uploads → PUT /v1/files/uploads/{id}/parts/{n} → POST .../completeکارهای طولانی
ویدئو و دیگر کارهای طولانی بلافاصله شناسه کار برمیگردانند. وضعیت کار را بپرسید یا مشترک وبهوک job.completed شوید و سپس نتیجه را دریافت کنید.
curl https://gapze.ir/v1/videos/generations -H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" -d '{"model":"VIDEO_MODEL","prompt":"..."}'
# → {"id":"job_...","status":"queued"}
curl https://gapze.ir/v1/jobs/job_... -H "Authorization: Bearer $API_KEY"
curl -L https://gapze.ir/v1/jobs/job_.../content -H "Authorization: Bearer $API_KEY" -o out.mp4وبهوکها
هر ارسال سرآیندهای webhook-id، webhook-timestamp و webhook-signature دارد. امضای HMAC-SHA256 را روی «id.timestamp.body» با کلید امضای خود بررسی کنید، زمانهای قدیمی را رد کنید و بر اساس id تکراریها را حذف کنید. هنگام چرخش کلید هر دو امضای قدیم و جدید ارسال میشوند.
import base64, hashlib, hmac, time
def verify(secret: str, headers: dict, body: bytes, tolerance=300) -> bool:
msg_id, ts = headers["webhook-id"], headers["webhook-timestamp"]
if abs(time.time() - int(ts)) > tolerance:
return False
key = base64.b64decode(secret.removeprefix("whsec_"))
mac = hmac.new(key, f"{msg_id}.{ts}.".encode() + body, hashlib.sha256).digest()
expected = "v1," + base64.b64encode(mac).decode()
return any(hmac.compare_digest(expected, s) for s in headers["webhook-signature"].split())حالت آزمایشی
کلیدهای آزمایشی فقط به شبیهساز داخلی دسترسی دارند و اعتبار آزمایشی مصرف میکنند. هر وقت آماده بودید از کلید اصلی استفاده کنید.
# test keys (sk_test_...) use the built-in simulator and test credits only
curl https://gapze.ir/v1/chat/completions -H "Authorization: Bearer sk_test_..." ...