tgpay cryptoAPI
crypto-payapiinvoicesrefunds

مرجع API: صورت‌حساب و بازگشت وجه

6 دقیقه مطالعهآخرین به‌روزرسانی: 9 اکتبر 2026

متدهای صورت‌حساب: createInvoice، getInvoices، deleteInvoice، refundInvoice. قراردادهای مشترک (احراز اصالت، قالب پاسخ، مبلغ‌ها، spend_id) در صفحه‌ی مرجع API پذیرنده آمده و راهنمای گام‌به‌گام در دریافت پرداخت با صورت‌حساب.

createInvoice

POST /pay/api/createInvoice — دامنه‌ی invoices، سقف 60 در دقیقه.

پارامترنوعاجباریمعنی
currency_typeرشتهخیرcrypto (پیش‌فرض) یا fiat
assetرشتهدر حالت رمزارزیدارایی مورد استفاده برای پرداخت، مثلاً USDT. همراه با fiat مجاز نیست
fiatرشتهدر حالت فیاتارز فیاتی که قیمت به آن تعیین شده (سطرهای is_fiat در getCurrencies)
accepted_assetsرشته / آرایهخیرفقط در حالت فیات: دارایی‌هایی که پرداخت‌کننده می‌تواند با آن‌ها بپردازد — یک رشته‌ی جداشده با ویرگول ("USDT,GRAM") یا یک آرایه‌ی JSON. اگر ارسال نشود، همه‌ی دارایی‌های پشتیبانی‌شده
amountرشتهبله، مگر open_amount تنظیم شده باشدرشته‌ی اعشاری مثبت: واحد دارایی در حالت رمزارزی، واحد فیات (حداکثر 2 رقم اعشار) در حالت فیات
open_amountبولیخیرافزوده، فقط در حالت رمزارزی: بدون مبلغ ثابت — پرداخت‌کننده خودش هنگام پرداخت مبلغ را وارد می‌کند (کمک مالی و انعام). هم‌زمان با amount مجاز نیست
descriptionرشتهخیرتا 1024 نویسه، که به پرداخت‌کننده نشان داده می‌شود
hidden_messageرشتهخیرتا 2048 نویسه، که فقط پس از پرداخت به پرداخت‌کننده نشان داده می‌شود
payloadرشتهخیرتا 4096 نویسه داده‌ی خودتان، که روی صورت‌حساب و وب‌هوک عیناً برمی‌گردد
allow_commentsبولیخیراجازه‌ی گذاشتن نظر به پرداخت‌کننده (پیش‌فرض true)
allow_anonymousبولیخیراجازه‌ی پنهان کردن هویت به پرداخت‌کننده (پیش‌فرض true)
paid_btn_nameرشتهخیردکمه‌ی پس از پرداخت: viewItem، openChannel، openBot یا callback
paid_btn_urlرشتهخیرنشانی http(s) همان دکمه — وقتی paid_btn_name ارسال شده باشد اجباری است
swap_toرشتهخیرپرداخت‌های دریافتی خودکار به این دارایی تبدیل شوند. در حد امکان: اگر تبدیل در لحظه‌ی پرداخت ممکن نباشد، پرداخت بدون تبدیل انجام می‌شود
expires_inعدد صحیحخیرثانیه تا انقضای صورت‌حساب، تا 2678400 (31 روز)؛ ارسال نشدن یا 0 یعنی عمر پیش‌فرض. expiration_date را در پاسخ بخوانید
rate_lock_secondsعدد صحیحخیرافزوده، فقط در حالت فیات: نرخ تبدیل را در لحظه‌ی ساخت برای این بازه قفل می‌کند (پایین‌تر)

توضیح، محتوای پس از پرداخت و دکمه ممکن است هنگام بررسی یا تا تأیید محتوا از پرداخت‌کننده پنهان بمانند. مبلغ صورت‌حساب همچنان قابل پرداخت است.

نتیجه — و محتوای وب‌هوک invoice_paid — همان شیء صورت‌حساب است. فیلدهای اصلی آن:

  • هویت و وضعیت: invoice_id، hash (شناسه‌ی عمومی داخل pay_url)، status (active / paid / expired)، pay_url — لینک t.me که برای پرداخت‌کننده می‌فرستید (bot_invoice_url، mini_app_invoice_url، web_app_invoice_url نام‌های جایگزین همان لینک‌اند).
  • مبلغ‌ها: amount (مبلغ اسمی — واحد فیات روی صورت‌حساب فیاتی، وگرنه رمزارز؛ تا وقتی صورت‌حساب با مبلغ دلخواه پرداخت نشده null است)، amount_minor، و روی صورت‌حساب‌های فیاتیِ پرداخت‌شده paid_asset / paid_amount / paid_fiat_rate — یعنی رمزارزی که واقعاً کسر شد و نرخی که به کار رفت.
  • کارمزد: fee_asset / fee_amount، که در لحظه‌ی پرداخت ثبت می‌شوند — رقم مرجع برای حسابداری شما (fee و usd_rate نام‌های قدیمی Crypto Bot و منسوخ‌اند). کارمزد و سقف‌ها را ببینید.
  • پرداخت‌کننده: paid_by_user_id (وقتی پرداخت‌کننده ناشناس مانده null)، paid_anonymously، comment.
  • بازگشت وجه (افزوده): refunded_amount / refunded_minor (تجمعی) و refunded_at، که پس از بازگشت کامل ثبت می‌شود.
  • قفل نرخ (افزوده): rate_lock_until و rate_lock_rates — نرخ‌های ثبت‌شده‌ی هر دارایی، که بدون درخواست قفل null می‌مانند.
  • همان‌طور که ساخته شد: description، hidden_message، payload، paid_btn_name / paid_btn_url، expiration_date (expires_at نام دیگر آن است) و فیلدهای تبدیل (swap_to، is_swapped، swapped_to، swapped_rate، swapped_output، …).

خطاها: 400 invalid_currency (اشتباه گرفتن asset و fiat)، 400 invalid_amount، 400 unknown_asset، 400 unsupported_fiat، 400 paid_btn_url_required، و برای درخواست‌های قفل نرخ 400 rate_lock_fiat_only، 409 ratelock_disabled، 409 rate_unavailable (برای یکی از دارایی‌های پذیرفته‌شده نرخ به‌روزی در دسترس نیست — دوباره تلاش کنید).

صورت‌حساب‌ها چگونه پرداخت می‌شوند

پرداخت‌کننده از موجودی کیف پولش در مینی‌اپ آنی و بدون کارمزد شبکه می‌پردازد؛ موجودی کافی و تأیید پرداخت لازم است. همچنین می‌تواند از کیف پول بیرونی واریز کند: در صورت دسترسی به این گزینه، برنامه آدرس و مهلت پرداخت را نشان می‌دهد. واریز به کیف پول خود پرداخت‌کننده اضافه می‌شود. پرداخت خودکار به واریز در همان آدرس، موجودی قابل استفاده کافی، نبود محدودیت خروجی و معتبر بودن درخواست پرداخت و صورت‌حساب نیاز دارد. واریز دیررس در کیف پول می‌ماند و به معنی پرداخت صورت‌حساب نیست. در هر دو حالت، یک صورت‌حساب عادی paid و، در صورت تنظیم آدرس وب‌هوک، رویداد invoice_paid می‌بینید؛ پارامتر یا فیلد اضافی برای پردازش وجود ندارد.

در صورت‌حساب فیات، مقدار رمزارز هنگام پرداخت محاسبه و تا کوچک‌ترین واحد دارایی انتخابی رو به بالا گرد می‌شود. سپس کارمزد پذیرنده از همان مقدار کسر می‌شود. اگر نرخ قفل‌شده معتبر یا نرخ تازه در دسترس نباشد، پرداخت ناموفق می‌شود و با نرخ قدیمی تسویه نمی‌شود.

قفل کردن نرخ روی صورت‌حساب فیاتی

با فرستادن rate_lock_seconds نرخ لحظه‌ی ساخت برای هر دارایی پذیرفته‌شده ثبت می‌شود. تا وقتی قفل برقرار است، پرداخت‌کننده دقیقاً همان مبلغ‌های ثبت‌شده را می‌بیند و پرداخت با همان نرخ تبدیل می‌شود — ریسک نرخ در آن بازه با شماست. سرور مدت درخواستی را با محدوده پشتیبانی‌شده تطبیق می‌دهد. مهلت واقعی را از rate_lock_until پاسخ بخوانید.

وقتی قفل تمام شود، صورت‌حساب منقضی‌نشده همچنان قابل پرداخت می‌ماند و به‌طور خودکار به تبدیل لحظه‌ی پرداخت برمی‌گردد. اگر می‌خواهید صورت‌حساب هم‌زمان با نرخ منقضی شود، expires_in را در محدوده پشتیبانی‌شده قفل انتخاب کنید و expiration_date و rate_lock_until پاسخ را مقایسه کنید.

getInvoices

GET /pay/api/getInvoices — دامنه‌ی read. فیلترها: asset، fiat، invoice_ids (جداشده با ویرگول)، status (active / paid / expired — expired افزوده است؛ active صورت‌حساب‌هایی را که مهلت آن‌ها گذشته است شامل نمی‌شود)، به‌علاوه‌ی offset / count. خروجی {"items": [invoice, …]} است، به ترتیب از جدیدترین.

deleteInvoice

POST /pay/api/deleteInvoice — دامنه‌ی invoices. یک پارامتر: invoice_id. صورت‌حساب پرداخت‌نشده را لغو می‌کند و true برمی‌گرداند. خطاها: 404 invoice_not_found، 409 invoice_already_paid — صورت‌حساب پرداخت‌شده را نمی‌شود حذف کرد، دارایی پیش‌تر جابه‌جا شده است.

refundInvoice

POST /pay/api/refundInvoice — دامنه‌ی refunds، سقف 30 در دقیقه. افزوده‌ای بر Crypto Bot: همه یا بخشی از رمزارز واقعاً پرداخت‌شده را از موجودی برنامه به پرداخت‌کننده برمی‌گرداند، حتی به پرداخت‌کننده ناشناس و بدون افشای هویت. در صورت‌حساب فیات از paid_asset و paid_amount استفاده کنید؛ بازپرداخت تبدیل فیات جدیدی نیست.

پارامترنوعاجباریمعنی
invoice_idعدد صحیحبلههمان صورت‌حساب پرداخت‌شده
amountرشتهخیرمقدار رمزارز بازپرداختی به دارایی اولیه پرداخت (paid_asset برای فیات). اگر ارسال نشود، تمام باقی‌مانده بازپرداخت‌نشده. بازپرداخت‌های جزئی تا سقف مقدار رمزارز اولیه جمع می‌شوند
spend_idرشتهخیرکلید جلوگیری از پرداخت دوباره — از آن استفاده کنید تا درخواستی که تایم‌اوت شده به‌جای بازگرداندن دوباره، همان نتیجه را تکرار کند

نتیجه، شیء به‌روزشده‌ی صورت‌حساب است با refunded_amount / refunded_minor تجمعی؛ refunded_at وقتی ثبت می‌شود که مبلغ صورت‌حساب به‌طور کامل بازگشته باشد. وضعیت paid می‌ماند. کارمزد پلتفرم برنمی‌گردد. موجودی کافی از دارایی اولیه پرداخت لازم است، حتی اگر swap_to مبلغ دریافتی را به دارایی دیگری تبدیل کرده باشد. هر بازگشت، وب‌هوک اختیاری refund_completed را می‌فرستد.

خطاها: 404 invoice_not_found، 409 invoice_not_paid، 409 already_refunded (چیزی برای بازگرداندن نمانده)، 409 amount_too_big (بیشتر از باقی‌مانده‌ی بازنگشته)، 409 insufficient_funds، 400 invalid_amount، و دو خطای مربوط به spend_id، یعنی 409 idempotency_conflict / 409 idempotency_in_progress.