curl --request POST \
--url https://sg.sandbox.api.reap.global/crypto-withdrawals/{id}/sign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<string>"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({executionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', signature: '<string>'})
};
fetch('https://sg.sandbox.api.reap.global/crypto-withdrawals/{id}/sign', 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/{id}/sign"
payload = {
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<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_SIGNATURE_INVALID",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_NOT_SIGNABLE",
"message": "<string>",
"detail": {}
}
}Submit withdrawal signature
Submits the wallet owner signature over the current signing payload. The withdrawal then proceeds to broadcast.
curl --request POST \
--url https://sg.sandbox.api.reap.global/crypto-withdrawals/{id}/sign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<string>"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({executionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', signature: '<string>'})
};
fetch('https://sg.sandbox.api.reap.global/crypto-withdrawals/{id}/sign', 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/{id}/sign"
payload = {
"executionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<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_SIGNATURE_INVALID",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "CRYPTO_WITHDRAWAL_NOT_SIGNABLE",
"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 - 255Path Parameters
Crypto withdrawal ID
Body
Submit the wallet owner signature for a crypto withdrawal
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