ثبت برداشت
POST
/v1/transactionsیک برداشت ثبت میکند.
کد 201 یعنی تراکنش تازه ساخته شد و 200 یعنی همان درخواست تکراری بوده و همان تراکنش اول برگشته است.
درخواست
curl -X POST 'https://api.romu.ir/v1/transactions' \ -H "X-Custody-Key-Id: $KEY_ID" \ -H "X-Custody-Timestamp: $TIMESTAMP" \ -H "X-Custody-Nonce: $NONCE" \ -H "X-Custody-Signature: $SIGNATURE" \ -H "Idempotency-Key: withdraw-8841" \ -H "Content-Type: application/json" \ -d '{ "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" }'import { romu } from "./romu.ts";
const res = await romu.post("/v1/transactions", { idempotencyKey: "withdraw-8841", json: { "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" },});console.log(res.status, res.body);status, body, err := client.Do("POST", "/v1/transactions", "", []byte(`{"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"}`), "withdraw-8841")import romu
status, body = romu.post( "/v1/transactions", idempotency_key="withdraw-8841", json={ "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" },)print(status, body)امضای درخواست را کتابخانه انجام میدهد؛ جزئیات: صفحهی امضا
هدرها
Idempotency-Keystringلازمشناسهی یکتای شما، 1 تا 255 نویسهی ASCII چاپی بی فاصله. جزو رشتهی امضاست. پیشوند
rebuild: رزرو است.بدنه
wallet_idUUIDلازمکیف پول مبدأ.
assetstringلازمکد دارایی، مثل
TRON_USDT یا BSC_USDT. شبکه از همین نام معلوم میشود.amountstringلازمرشتهی اعشاری در واحد خود دارایی، مثل
100.50. حداکثر به اندازهی decimals دارایی در GET /v1/assets، بیشتر از آن 400.to_addressstringلازمآدرس مقصد. روی شبکههای EVM تمامکوچک یا دقیقاً EIP-55.
expires_atRFC 3339لازمتا این زمان باید تأیید و امضا شود، وگرنه منقضی میشود. اگر زمان گذشته باشد، برداشت ثبت میشود و پس از سنجش قانونها
failed میشود.external_refstringمرجع خود شما. در Webhook برمیگردد.
فیلد ناشناخته در بدنه 400 میگیرد.
پاسخ
200همان درخواست با همان Idempotency-Key. همان تراکنش اول برمیگردد و created برابر false است.
201تراکنش تازه ساخته شد.
{ "transaction": { "id": "0192f1a2-5e4f-7a10-b2c3-d4e5f6a7b8c9", "wallet_id": "0192f19f-1d2c-7f3b-8a4e-6b7c8d9e0f12", "idempotency_key": "withdraw-8841", "type": "withdrawal", "origin": "api", "network": "TRON", "asset": "TRON_USDT", "amount": "100.5", "amount_raw": "100500000", "to_address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE", "external_ref": "user-1207", "status": "pending", "stage": "waiting_approval", "reason": null, "tx_hash": "", "expires_at": "2026-10-06T13:00:00Z", "created_at": "2026-10-06T12:00:00Z", "policy": { "decision": "needs_approval", "matched_rule": { "rule_id": "0192f1c1-0000-7000-8000-000000000001", "name": "تراکنش بزرگ" } } }, "created": true}فیلدها
transactionobjectلازمtransaction.idUUIDلازمtransaction.wallet_idUUIDلازمtransaction.idempotency_keystringtransaction.typestringفقطخواندنی.
internal جابهجایی از کنسول است. sweep فقط با ?id= دیده میشود.withdrawalinternalsweeptransaction.originstringفقطخواندنی.
system فقط برای sweep است.apiconsolesystemtransaction.networkstringلازمTRONBSCtransaction.assetstringلازمکد دارایی، مثل
TRON_USDT.transaction.amountstringلازمرشتهی اعشاری در واحد خود دارایی، مثل
100.5.transaction.amount_rawstringهمان مبلغ در کوچکترین واحد، برای تطبیق دقیق.
transaction.amount_usdstring | nullارزش مبلغ به دلار آمریکا وقتی قانونها آن را سنجیدند، رشتهی اعشاری مثل
301.5. پیش از آن، یا وقتی دارایی نرخ نداشت، null.transaction.usd_ratestring | nullنرخ دلاری هر واحد دارایی که
amount_usd با آن حساب شد، مثل 1.005. هر وقت amount_usd نباشد، null.transaction.usd_rate_atRFC 3339 | nullزمانی که آن نرخ خوانده شد. هر وقت
amount_usd نباشد، null.transaction.from_addressstring | nullآدرس سازمان که تراکنش از آن فرستاده میشود: آدرس اصلی کیف پول یا یکی از آدرسهای جمعآوری. اگر شناخته نباشد،
null.transaction.from_labelstring | nullبرچسب همان آدرس، همان که الان دارد. بی برچسب،
null.transaction.to_addressstringtransaction.external_refstringtransaction.statusstringلازمpendingcheckingconfirmedfailedcancelledtransaction.stagestring | nullکجای کار است. فقط در
pending و checking، وگرنه null.requestedwaiting_approvalwaiting_phonesigningsigning_retrysignedbroadcastconfirmingtransaction.reasonstring | nullچرا شکست خورد. فقط در
failed، وگرنه null.rejectedexpiredsigning_failedbroadcast_failedreorgedtransaction.tx_hashstringهش زنجیره، پس از ارسال.
transaction.expires_atRFC 3339transaction.created_atRFC 3339transaction.superseded_bystringجانشین تراکنش، فقط وقتی هست که جانشین ساخته شده باشد.
transaction.policyobject | nullتصمیم قانونها. وقتی تصمیمی ثبت نشده باشد
null است.transaction.policy.decisionstringauto_approveneeds_approvalrejecttransaction.policy.matched_ruleobject | nulltransaction.policy.matched_rule.rule_idstringtransaction.policy.matched_rule.namestringcreatedbooleanلازمtrue برای تراکنش تازه، false برای تکرار همان درخواست.خطاها
400
invalid request یا malformed request body: بدنه، پارامتر یا فیلد نادرست است، یا فیلد ناشناخته دارد.401
unauthenticated: هر شکست احراز هویت همین پاسخ را دارد.403
permission denied (کلید دسترسی ندارد یا کیف پول بیرون از فهرست کلید است)، یا org_suspended (سازمان معلق است، با reason_code و public_note).404
not found: مسیر یا شیء پیدا نشد. خواندن کیف پولی بیرون از فهرست کلید هم همین است.409
already exists (همان Idempotency-Key با درخواست دیگر)، failed precondition، یا insufficient_balance (با مقدارها).413
request too large: بدنه بیش از 16 KiB است.429
too many requests: بیش از سقف نرخ. پس از Retry-After ثانیه دوباره بفرستید.503
try again later، org_paused (سازمان موقتاً متوقف شده، با Retry-After: 60)، یا در ثبت برداشت suspension_unknown (با Retry-After: 5). همان درخواست را با همان Idempotency-Key دوباره بفرستید.بدنهی خطا همیشه {"error":"..."} است. راهنمای خطاها میگوید برای هر کد چه باید کرد.