فرستادن برداشت
برداشت را با یک درخواست میفرستید و قدم به قدم خبر میگیرید.
ثبت
بخش «ثبت»POST /v1/transactions با دسترسی withdraw و هدر Idempotency-Key:
{ "wallet_id": "0192f19f-1d2c-7f3b-8a4e-6b7c8d9e0f12", "asset": "TRON_USDT", "amount": "100.50", "to_address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE", "expires_at": "2026-10-06T13:00:00Z", "external_ref": "user-1207"}amountمبلغ در واحد خود دارایی:"100.50"یعنی 100.5 USDT. پاسخ همیشه بی صفر انتهایی است:"100.5"."100"یعنی 100 واحد خود دارایی، مثلاً 100 USDT.- مبلغ رشته است، نه عدد، چون عدد اعشاری در برنامهها خطای گرد کردن دارد.
- حداکثر به اندازهی اعشار دارایی رقم بنویسید: برای
TRON_USDTشش رقم. بیشتر از آن400میگیرد. اعشار هر دارایی را از فهرست داراییها یاGET /v1/assetsبخوانید. - پاسخها
amount_rawرا هم دارند: همان مبلغ در کوچکترین واحد، برای تطبیق دقیق. expires_atلازم است و مهلت تأیید و امضاست. اگر زمان گذشته باشد، برداشت ثبت میشود و پس از سنجش قانونهاfailedباreasonبرابرrejectedمیشود.external_refمرجع خود شماست و در Webhook برمیگردد.
پاسخ 201 یعنی تراکنش تازه ساخته شد و 200 یعنی تکرار همان درخواست بود. همهی فیلدها در مرجع ثبت برداشت هستند.
جابهجایی بین کیف پولهای خودتان از کنسول انجام میشود.
این جابهجاییها هم در فهرست تراکنشها میآیند تا موجودی را بتوانید تطبیق دهید. دو فیلد فقطخواندنی آنها را جدا میکنند:
| فیلد | مقدار |
|---|---|
type |
withdrawal یا internal |
origin |
api یا console |
با ?id= یک تراکنش دیگر هم دیده میشود: type برابر sweep و origin برابر system برای جمعآوری خودکار. در فهرست نمیآید.
در فهرست با ?type= و ?origin= فیلتر کنید: GET /v1/transactions?type=withdrawal&origin=api.
آدرس روی شبکههای EVM
بخش «آدرس روی شبکههای EVM»- در درخواست، آدرس را تمامکوچک یا دقیقاً EIP-55 بفرستید. checksum غلط
400است. - در پاسخها و Webhook آدرس همیشه EIP-55 است.
موجودی ناکافی
بخش «موجودی ناکافی»اگر آدرس مبدأ مبلغ و سقف کارمزد را نداشته باشد، این پاسخ برمیگردد و هیچ برداشتی ثبت نمیشود:
{ "error": "insufficient_balance", "asset": "TRON_USDT", "requested": "5", "available": "0.00001", "fee_asset": null, "fee_ceiling": null, "fee_available": null}سه فیلد کارمزد وقتی خود دارایی کم است null هستند. برای برداشت خود سکهی زنجیره (TRX یا BNB)، مقدار fee_asset همان asset است و requested بهعلاوهی fee_ceiling باید موجود باشد. اگر زنجیره جواب ندهد 503 میگیرید؛ همان درخواست را با همان Idempotency-Key دوباره بفرستید.
ترتیب ارسال
بخش «ترتیب ارسال»ترتیب ارسال با رومو است و شما فقط ثبت میکنید. روی شبکهی EVM (BSC) برداشتهای هر آدرس مبدأ یکییکی فرستاده میشوند و برداشتی که منتظر نوبتش است pending / signing را نشان میدهد.
برای یک انتقال هرگز درخواست دوم نسازید؛ درخواست اول زنده است و تا پایان، وضعیتش را با همان شناسه بخوانید (همان Idempotency-Key همان درخواست را برمیگرداند).
وضعیتها
بخش «وضعیتها»هر برداشت یک status دارد. تا وقتی کار ادامه دارد، stage میگوید کجاست. وقتی شکست خورد، reason میگوید چرا.
status |
یعنی |
|---|---|
pending |
در نوبت است و هنوز به شبکه نرفته |
checking |
به شبکه رفته و منتظر قطعی شدن است |
confirmed |
در شبکه قطعی شد. پایان موفق |
failed |
انجام نشد. reason دلیل را میگوید |
cancelled |
لغو شد |
مسیر عادی از بالا به پایین است. کنار هر قدم، راههای خروج از مسیر آمده است.
- pending / requested
برداشت ثبت شد و قانونها آن را میسنجند.
failed / rejectedقانون اجازه نداد. - pending / waiting_approval
منتظر تأییدکنندهها در اپ است. برداشت خودکار از این قدم رد میشود.
failed / rejectedیک تأییدکننده رد کرد.failed / expiredتا expires_at تأیید نشد.cancelledبا API یا کنسول لغو شد. - pending / signing
تراکنش امضا میشود، یا منتظر نوبت ارسال است.
pending / waiting_phoneمنتظر گوشی مدیر. پایان نیست.pending / signing_retryامضا شکست خورد و دوباره امتحان میشود. پایان نیست. این `failed` نیست، پس دوباره نفرستید.failed / signing_failedامضا نشد. - pending / signed
امضا آماده است.
- checking / broadcast
به شبکه فرستاده شد.
failed / broadcast_failedارسال نشد. - checking / confirming
در شبکه است و منتظر تأییدهای شبکه.
failed / reorgedشبکه تراکنش را برگرداند. نادر است. - confirmed
در شبکه قطعی شد.
وضعیت را با GET /v1/transactions?id= یا با رویداد transaction.updated دنبال کنید. برای دیدن فهرست برداشتهای منتظر تأیید: GET /v1/transactions?stage=waiting_approval.
reason |
یعنی | چه باید کرد |
|---|---|---|
rejected |
قانون یا یک تأییدکننده رد کرد | درخواست را بررسی کنید |
expired |
تا expires_at انجام نشد |
اگر هنوز لازم است، برداشت تازه با Idempotency-Key تازه بفرستید |
signing_failed |
امضا انجام نشد | همان کار بالا. اگر سقف روزانه پر است، بعداً بفرستید یا سقف را بالاتر ببرید |
broadcast_failed |
به شبکه نرسید | با رومو تماس بگیرید |
reorged |
شبکه تراکنش را برگرداند | با رومو تماس بگیرید |
لغو
بخش «لغو»POST /v1/transactions/cancel با {"transaction_id": "...", "reason": "..."}.
- فقط برداشتی که همین کلید ساخته و هنوز امضا نشده است: در
waiting_approval،waiting_phone،signing_retryو درsigningتا وقتی امضا شروع نشده. درrequestedو ازsignedبه بعد نمیشود. reasonلازم است: 1 تا 500 نویسه.- پاسخ
200باstatusبرابرcancelledو رویدادtransaction.updated. لغو دوباره همان را بی تغییر برمیگرداند. 409وقتی ممکن است امضا شده باشد یا در وضعیت دیگری است.403برای برداشت کلید دیگر یا کنسول.- وقتی سازمان متوقف یا معلق است هم کار میکند.
سازمان متوقف یا معلق
بخش «سازمان متوقف یا معلق»| پاسخ | یعنی |
|---|---|
503 با org_paused و Retry-After: 60 |
سازمان موقتاً متوقف شده است. برداشت، ساخت آدرس و جمعآوری تازه منتظر میماند. خواندنها، لغو و ارسال دوبارهی Webhook باز هستند |
403 با org_suspended و Retry-After: 3600 |
سازمان معلق است. فقط برداشت تازه رد میشود. reason_code و public_note دلیل را میگویند |
503 با suspension_unknown و Retry-After: 5 |
وضعیت تعلیق معلوم نشد. دوباره بفرستید |