curl --request POST \
--url https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '{}'import requests
url = "https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress"
payload = {}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"counterpartyId": "<string>",
"customerId": "<string>",
"status": "created",
"sourceDepositInstructions": {
"kind": "crypto",
"address": "<string>",
"currency": "USDC",
"network": "ethereum",
"amount": "<string>"
},
"references": {
"payoutHoldReason": "<string>",
"quoteId": "<string>",
"providerQuoteId": "<string>",
"liquidationAddress": "<string>",
"vaultId": "<string>",
"disbursementVaultId": "<string>",
"depositReference": "<string>",
"depositTxHash": "<string>",
"depositSourceAddress": "<string>",
"payinReference": "<string>",
"tradeId": "<string>",
"sweepTxId": "<string>",
"sweepTxHash": "<string>",
"failedSweepTxIds": [
"<string>"
],
"onforwardTxId": "<string>",
"failedOnforwardTxIds": [
"<string>"
],
"onforwardToAddress": "<string>",
"onforwardTxHash": "<string>",
"onforwardDepositId": "<string>",
"fiatWithdrawalId": "<string>",
"rejectedFiatWithdrawals": [
"<string>"
],
"stablecoinWithdrawalId": "<string>",
"fxFundingPayoutId": "<string>",
"sendTxId": "<string>",
"sendTxHash": "<string>",
"failedSendTxIds": [
"<string>"
],
"payoutId": "<string>",
"ledgerEntryRefs": [
"<string>"
],
"lastCaseReason": "<string>",
"lastCaseAt": "<string>"
},
"timeline": [
{
"status": "created",
"at": "2023-11-07T05:31:56Z",
"providerRef": "<string>",
"description": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"type": "offramp",
"source": {
"currency": "USDC",
"network": "ethereum",
"amount": "<string>"
},
"destination": {
"account_holder_name": "<string>",
"bsb_code": "<string>",
"account_number": "<string>",
"bank_country": "<string>",
"currency": "AUD"
},
"destinationAmount": "<string>",
"destinationCurrency": "AUD",
"routeId": "<string>",
"quoteId": "<string>",
"metadata": {},
"developerFee": {
"amount": "<string>",
"currency": "AUD"
},
"exchangeRate": "<string>"
}Progress a waiting transfer
Releases an on-ramp transfer waiting at awaiting_client_action on a client-gated route so it converts at the live rate at the moment of the call and is delivered like any other funding.
curl --request POST \
--url https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '{}'import requests
url = "https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress"
payload = {}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.rails.wayex.com/v1/transfers/{id}/progress")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"counterpartyId": "<string>",
"customerId": "<string>",
"status": "created",
"sourceDepositInstructions": {
"kind": "crypto",
"address": "<string>",
"currency": "USDC",
"network": "ethereum",
"amount": "<string>"
},
"references": {
"payoutHoldReason": "<string>",
"quoteId": "<string>",
"providerQuoteId": "<string>",
"liquidationAddress": "<string>",
"vaultId": "<string>",
"disbursementVaultId": "<string>",
"depositReference": "<string>",
"depositTxHash": "<string>",
"depositSourceAddress": "<string>",
"payinReference": "<string>",
"tradeId": "<string>",
"sweepTxId": "<string>",
"sweepTxHash": "<string>",
"failedSweepTxIds": [
"<string>"
],
"onforwardTxId": "<string>",
"failedOnforwardTxIds": [
"<string>"
],
"onforwardToAddress": "<string>",
"onforwardTxHash": "<string>",
"onforwardDepositId": "<string>",
"fiatWithdrawalId": "<string>",
"rejectedFiatWithdrawals": [
"<string>"
],
"stablecoinWithdrawalId": "<string>",
"fxFundingPayoutId": "<string>",
"sendTxId": "<string>",
"sendTxHash": "<string>",
"failedSendTxIds": [
"<string>"
],
"payoutId": "<string>",
"ledgerEntryRefs": [
"<string>"
],
"lastCaseReason": "<string>",
"lastCaseAt": "<string>"
},
"timeline": [
{
"status": "created",
"at": "2023-11-07T05:31:56Z",
"providerRef": "<string>",
"description": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"type": "offramp",
"source": {
"currency": "USDC",
"network": "ethereum",
"amount": "<string>"
},
"destination": {
"account_holder_name": "<string>",
"bsb_code": "<string>",
"account_number": "<string>",
"bank_country": "<string>",
"currency": "AUD"
},
"destinationAmount": "<string>",
"destinationCurrency": "AUD",
"routeId": "<string>",
"quoteId": "<string>",
"metadata": {},
"developerFee": {
"amount": "<string>",
"currency": "AUD"
},
"exchangeRate": "<string>"
}What this endpoint does
Releases an on-ramp transfer waiting atawaiting_client_action on a client-gated route so it converts at the live rate at the moment of the call and is delivered like any other funding.
When to use it
Call it once you have decided to accept a payment that arrived on a route withclientGate enabled. Send an empty body.
Before you call
Use a secret API key with transfer write access and pass a transfer owned by this tenant account. A request made from a console session also needs a recent second-factor confirmation. The customer must still be entitled for on-ramp (403 entitlement_lapsed otherwise; a refund is still available).
Money and balance effect
Converts the full landed AUD at the live rate struck when you progress, then sends the stablecoin to the route’s destination. Nothing is converted before you call this.States and completion
The transfer re-entersscreening and continues through the normal states to completed. A repeat call after it has taken effect returns 200 with the current state. A transfer that is not waiting returns 409 transfer_not_awaiting_client_action; 409 client_gate_decision_taken means a refund was already chosen; 409 refund_in_progress, refund_may_have_executed, refund_recall_ambiguous, or refund_evidence_unverifiable mean an earlier refund attempt must be settled first.
Safe retries
Send a uniqueIdempotency-Key. If the response is lost, retry with the same key, or read the transfer first. 409 client_gate_busy and client_gate_window_unavailable mean another action on the transfer is in progress — retry shortly.
Read Activity and history for the complete workflow.Authorizations
Send the same Wayex API key as Authorization: Bearer <key>.
Headers
A unique key for this logical action. Reuse the same key and identical payload when retrying after an unknown response.
8 - 255Path Parameters
Body
The body is of type object.
Response
The transfer after the decision.
- Option 1
- Option 2
Unique identifier for this transfer.
1The client account (counterparty) this transfer belongs to. For API callers this is always your own account id.
1The customer this transfer is for.
1Current lifecycle status. State advances asynchronously, so treat this as the source of truth.
created, validated, screening, fx_executed, completed, awaiting_deposit, deposit_detected, deposit_confirming, deposit_cleared, sweeping, onforwarding, payout_instructed, payout_held, payout_settled, awaiting_payin, payin_cleared, disbursing, sending, send_confirming, pooled, awaiting_client_action, refunding, on_hold, frozen, failed, cancelled, returned, expired, reversing, reversed - Option 1
- Option 2
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Ordered history of the states this transfer passed through, with timestamps.
Show child attributes
Show child attributes
When the transfer was created (ISO 8601).
When the transfer was last updated (ISO 8601).
offramp Show child attributes
Show child attributes
- Option 1
- Option 2
Show child attributes
Show child attributes
Net AUD the customer receives as a decimal string; set once the conversion executes ("0" before).
^\d+(\.\d+)?$AUD The payment route whose funding spawned this transfer.
1Reference to the live price struck at funding; absent until the conversion executes.
1Show child attributes
Show child attributes
Your developer fee withheld from this conversion (AUD). Present once the conversion executes; omitted on a returned, reversing or reversed transfer.
Show child attributes
Show child attributes
Destination units per one source unit the conversion executed at, excluding your developer fee. Present once the conversion executes.
^\d+(\.\d+)?$
