404 TEAM

در حال آماده‌سازی…

برای توسعه‌دهنده‌ها

مستندات API

خرید استارز و پریمیوم تلگرام از فرگمنت با یک درخواست HTTP. مبلغ از کیف پول شما کم می‌شود و تحویل خودکار انجام می‌شود.

شروع سریع

آدرس پایه (Base URL):

https://your-site.ir/api/v1
  1. در سایت وارد حساب خود شوید و از «حساب من ← API» (یا از پشتیبانی) یک کلید API بسازید. کلید فقط یک‌بار نمایش داده می‌شود.
  2. کیف پول خود را شارژ کنید؛ هر سفارش از موجودی کیف پول پرداخت می‌شود.
  3. اتصال را آزمایش کنید:
curl https://your-site.ir/api/v1/ping \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

همه‌ی پاسخ‌ها JSON (UTF-8) هستند. مبلغ‌ها تومان و عدد صحیح‌اند، زمان‌ها ISO 8601 (UTC).

احراز هویت

کلید را در هدر Authorization: Bearer sk_live_XXXX بفرستید. کلید را هرگز در آدرس (query string) نفرستید و در کد سمت مرورگر یا اپلیکیشن موبایل قرار ندهید؛ فقط از سرور خودتان صدا بزنید.

  • کلید فقط به‌صورت هش در سرور ذخیره می‌شود؛ گم‌شدنش قابل بازیابی نیست، کلید تازه بسازید و قدیمی را حذف کنید.
  • می‌توانید برای هر کلید «آی‌پی‌های مجاز»، «سقف خرج روزانه» و «فقط‌خواندنی» تعیین کنید.
  • ۳۰ تلاش با کلید اشتباه در ۱۰ دقیقه آی‌پی شما را موقتاً مسدود می‌کند.

محدودیت نرخ

به‌طور پیش‌فرض ۶۰ درخواست در دقیقه برای هر کلید. وضعیت در هر پاسخ:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1767225600   # زمان یونیکس شروع پنجره‌ی بعد

بعد از گذشتن از سقف، پاسخ 429 با هدر Retry-After (ثانیه) برمی‌گردد. بررسی گیرنده (/recipients) سقف جداگانه‌ی ۲۰ بار در دقیقه دارد.

خطاها

همه‌ی خطاها این قالب را دارند و کد HTTP مناسب برمی‌گردد:

{ "error": { "code": "insufficient_funds", "message": "موجودی کیف پول کافی نیست.", "details": {} } }
HTTPcodeمعنا
401missing_api_key / invalid_api_keyکلید ارسال نشده، نامعتبر، حذف یا غیرفعال است
402insufficient_fundsموجودی کیف پول برای این سفارش کافی نیست (چیزی کم نمی‌شود)
403ip_not_allowed / orders_not_allowed / account_blockedآی‌پی مجاز نیست، کلید فقط‌خواندنی است یا حساب مسدود است
404not_found / recipient_not_foundسفارش یا گیرنده پیدا نشد
409idempotency_key_reused / not_cancellableIdempotency-Key با درخواست دیگری استفاده شده؛ سفارش دیگر قابل لغو نیست
415unsupported_media_typeContent-Type باید application/json باشد
422validation_errorورودی نامعتبر است؛ details.field فیلد مشکل‌دار را نشان می‌دهد
429rate_limited / daily_limit_exceededمحدودیت نرخ یا سقف خرج روزانه‌ی کلید
502 / 503delivery_failed / service_unavailable / api_disabledسرویس موقتاً در دسترس نیست؛ بعداً دوباره تلاش کنید (پولی کم نشده)

Idempotency (جلوگیری از ثبت دوباره)

اگر درخواست ثبت سفارش به‌خاطر قطعی شبکه بی‌پاسخ ماند، چه‌کار کنیم که دوبار سفارش ثبت نشود؟ هنگام ثبت هر سفارش یک شناسه‌ی یکتا در هدر Idempotency-Key بفرستید (حداکثر ۶۴ نویسه). تکرار همان درخواست با همان کلید، همان سفارش را با کد 200 و هدر Idempotent-Replay: true برمی‌گرداند و دوباره پولی کم نمی‌شود. اگر همان کلید را با داده‌ی دیگری بفرستید 409 می‌گیرید.

curl -X POST https://your-site.ir/api/v1/orders \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Idempotency-Key: order-2026-0001" \
  -H "Content-Type: application/json" \
  -d '{"type":"stars","recipient":"durov","quantity":100}'

چرخه‌ی سفارش

وبهوک (webhook) ندارد؛ بعد از ثبت سفارش هر ۳ تا ۵ ثانیه GET /orders/{id} را صدا بزنید تا status به یک وضعیت نهایی برسد.

statusمعنانهایی؟
queuedپرداخت شد و در صف خرید از فرگمنت استخیر
reviewمبلغ بالاتر از سقف ارسال خودکار است و منتظر تأیید دستی مدیر است (قابل لغو)خیر
processingخرید در حال انجام است (ممکن است خطای موقتی خورده و دوباره تلاش شود)خیر
completedتحویل شد؛ tx_hash تراکنش TON برگردانده می‌شودبله
failedتحویل ممکن نشد (مثلاً گیرنده پیدا نشد) و مبلغ خودکار به کیف پول برگشت؛ error علت را داردبله
cancelledبا درخواست شما لغو و مبلغ برگشت داده شدبله
refundedمبلغ توسط پشتیبانی بازگردانده شدبله

هیچ‌وقت برای یک سفارش دوبار از فرگمنت خرید انجام نمی‌شود؛ حتی اگر تلاش دوباره لازم شود. اگر TON فرستاده شده باشد ولی تأیید نشانی نیامده باشد، سفارش در حالت processing می‌ماند و بازگشت خودکار انجام نمی‌شود (ممکن است تحویل شده باشد)؛ با پشتیبانی تماس بگیرید.

مرجع endpointها

دکمه‌ی «اجرا» درخواست واقعی می‌فرستد؛ سفارش واقعاً ثبت و مبلغ کسر می‌شود.

در حال بارگذاری…

نمونه‌ی کد

# pip install requests
import requests, time, uuid

BASE = "https://your-site.ir/api/v1"
H = {"Authorization": "Bearer sk_live_YOUR_KEY"}

order = requests.post(f"{BASE}/orders", headers={**H, "Idempotency-Key": str(uuid.uuid4())},
                      json={"type": "stars", "recipient": "durov", "quantity": 100}, timeout=30).json()
oid = order["id"]
while True:
    o = requests.get(f"{BASE}/orders/{oid}", headers=H, timeout=30).json()
    if o["status"] in ("completed", "failed", "cancelled", "refunded"):
        break
    time.sleep(4)
print(o["status"], o.get("tx_hash"))

سوالات رایج

خرید چطور از فرگمنت انجام می‌شود؟

سرور فروشگاه با ولت TON خودش (کلید ولت فقط روی سرویس امضای جدا می‌ماند) وارد fragment.com می‌شود، گیرنده را جست‌وجو و قیمت را دریافت می‌کند، تراکنش را امضا و ارسال می‌کند و تأیید روی شبکه را بررسی می‌کند. هر سفارش حداکثر یک تراکنش دارد.

اگر تحویل ناموفق شد پولم چه می‌شود؟

اگر خرید قطعاً انجام نشده و هیچ TON ای فرستاده نشده باشد (مثلاً گیرنده پیدا نشد)، مبلغ خودکار به کیف پول برمی‌گردد و status=failed می‌شود. خطاهای موقت (قطعی شبکه، شلوغی فرگمنت) خودکار تلاش دوباره می‌شوند.

حداقل و حداکثر تعداد؟

استارز: از GET /prices بخوانید (stars.min و stars.max؛ معمولاً حداقل ۵۰). پریمیوم: ۳، ۶ یا ۱۲ ماه.

گیرنده چه یوزرنیمی می‌تواند باشد؟

یوزرنیم تلگرام کاربر (۵ تا ۳۲ نویسه، حروف انگلیسی، عدد و _) با یا بدون @. برای پریمیوم، حسابی که هم‌اکنون پریمیوم دارد پذیرفته نمی‌شود (already_premium). پیش از خرید با GET /recipients/{username} می‌توانید بررسی کنید.

تست ندارد؟

این API فقط روی سیستم واقعی کار می‌کند و محیط شبیه‌ساز ندارد؛ برای آزمایش از کمترین مقدار (۵۰ استارز) استفاده کنید.