curl --request POST \
--url https://sg.sandbox.api.reap.global/crypto-withdrawals/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": "ETHEREUM_MAINNET",
"assetId": "<string>",
"amount": "100.000000",
"destinationAddress": "<string>"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
accountId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
chainId: 'ETHEREUM_MAINNET',
assetId: '<string>',
amount: '100.000000',
destinationAddress: '<string>'
})
};
fetch('https://sg.sandbox.api.reap.global/crypto-withdrawals/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/crypto-withdrawals/"
payload = {
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": "ETHEREUM_MAINNET",
"assetId": "<string>",
"amount": "100.000000",
"destinationAddress": "<string>"
}
headers = {
"Reap-Version": "<reap-version>",
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": "ETHEREUM_MAINNET",
"asset": {
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"logoUri": "<string>"
},
"amount": "100.000000",
"netAmount": "99.750000",
"fee": {
"amount": "0.250000",
"asset": {
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"logoUri": "<string>"
}
},
"destinationAddress": "<string>",
"status": "PENDING_SIGNATURE",
"failureReason": "REJECTED_BY_COMPLIANCE",
"transactionId": "<string>",
"expiresAt": "<string>",
"completedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_INVALID_ASSET",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWALS_NOT_ENABLED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_ACCOUNT_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_ALREADY_IN_FLIGHT",
"message": "<string>",
"detail": {}
}
}Initiate crypto withdrawal
Reserves funds against an in-flight withdrawal and opens the signature window. Fetch a signing payload with GET /crypto-withdrawals/:id/payload, then submit the owner signature with POST /crypto-withdrawals/:id/sign.
curl --request POST \
--url https://sg.sandbox.api.reap.global/crypto-withdrawals/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": "ETHEREUM_MAINNET",
"assetId": "<string>",
"amount": "100.000000",
"destinationAddress": "<string>"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
accountId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
chainId: 'ETHEREUM_MAINNET',
assetId: '<string>',
amount: '100.000000',
destinationAddress: '<string>'
})
};
fetch('https://sg.sandbox.api.reap.global/crypto-withdrawals/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/crypto-withdrawals/"
payload = {
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": "ETHEREUM_MAINNET",
"assetId": "<string>",
"amount": "100.000000",
"destinationAddress": "<string>"
}
headers = {
"Reap-Version": "<reap-version>",
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chainId": "ETHEREUM_MAINNET",
"asset": {
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"logoUri": "<string>"
},
"amount": "100.000000",
"netAmount": "99.750000",
"fee": {
"amount": "0.250000",
"asset": {
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"logoUri": "<string>"
}
},
"destinationAddress": "<string>",
"status": "PENDING_SIGNATURE",
"failureReason": "REJECTED_BY_COMPLIANCE",
"transactionId": "<string>",
"expiresAt": "<string>",
"completedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_INVALID_ASSET",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWALS_NOT_ENABLED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_ACCOUNT_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_ALREADY_IN_FLIGHT",
"message": "<string>",
"detail": {}
}
}Authorizations
API key as Bearer token
Headers
API version (YYYY-MM-DD)
2025-02-14 "2025-02-14"
Unique key for safely retrying this request. Up to 255 characters; we recommend a UUIDv4. The first request executes and its response is cached; subsequent requests with the same key replay the cached response (24h retention).
1 - 255Body
Initiate a crypto withdrawal from an account wallet
Account whose wallet the funds leave
Blockchain network to withdraw on
ETHEREUM_MAINNET, ETHEREUM_SEPOLIA, BASE_MAINNET, BASE_SEPOLIA, ARBITRUM_ONE_MAINNET, ARBITRUM_ONE_SEPOLIA, POLYGON_MAINNET, POLYGON_AMOY, SOLANA_MAINNET, SOLANA_DEVNET "ETHEREUM_MAINNET"
Asset to withdraw - the token contract address, or a reserved identifier for the chain native asset
Gross amount to withdraw, with decimals applied. The fee is taken out of this rather than charged on top.
"100.000000"
"0.5"
"1234.99"
Address that receives the net amount
Response
Crypto withdrawal resource
Unique withdrawal identifier
Account the funds are withdrawn from
Blockchain network the transfer happens on
ETHEREUM_MAINNET, ETHEREUM_SEPOLIA, BASE_MAINNET, BASE_SEPOLIA, ARBITRUM_ONE_MAINNET, ARBITRUM_ONE_SEPOLIA, POLYGON_MAINNET, POLYGON_AMOY, SOLANA_MAINNET, SOLANA_DEVNET "ETHEREUM_MAINNET"
Asset metadata
Show child attributes
Show child attributes
Gross amount requested, with decimals applied. The fee is taken out of this rather than charged on top.
"100.000000"
Amount the destination receives: the gross less the fee
"99.750000"
Fee charged for the withdrawal, fixed at the time it was requested
Show child attributes
Show child attributes
Address the funds are sent to
Current withdrawal status
PENDING_SIGNATURE, PROCESSING, COMPLETED, EXPIRED, CANCELLED, FAILED "PENDING_SIGNATURE"
What went wrong. Set only when the status is FAILED.
REJECTED_BY_COMPLIANCE, ACCOUNT_RESTRICTED, TRANSACTION_FAILED "REJECTED_BY_COMPLIANCE"
On-chain transaction identifier. Present once the transfer has been submitted to the network, which happens while the status is still PROCESSING.
When the signature window closes. Past this point the withdrawal is closed and the funds become spendable again.
When the transfer was observed to be irreversible on-chain, which is when the status became COMPLETED. Null until then.
ISO 8601 creation timestamp
ISO 8601 last update timestamp