curl --request POST \
--url https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions \
--header 'API-Key: <api-key>' \
--header 'API-Nonce: <api-key>' \
--header 'API-Sign: <api-key>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"from": {
"symbol": "USD",
"type": "balance",
"amount": "1000.00"
},
"to": {
"symbol": "ETH",
"type": "wallet",
"wallet": {
"via": "ethereum",
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"memo": "destination-memo",
"tag": "destination-tag"
}
}
}
'import requests
url = "https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions"
payload = {
"from": {
"symbol": "USD",
"type": "balance",
"amount": "1000.00"
},
"to": {
"symbol": "ETH",
"type": "wallet",
"wallet": {
"via": "ethereum",
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"memo": "destination-memo",
"tag": "destination-tag"
}
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'API-Key': '<api-key>',
'API-Sign': '<api-key>',
'API-Nonce': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
from: {symbol: 'USD', type: 'balance', amount: '1000.00'},
to: {
symbol: 'ETH',
type: 'wallet',
wallet: {
via: 'ethereum',
address: '0xabcdef1234567890abcdef1234567890abcdef12',
memo: 'destination-memo',
tag: 'destination-tag'
}
}
})
};
fetch('https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions', 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.services.payward.com/v1/accounts/{account_id}/on-demand-conversions",
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([
'from' => [
'symbol' => 'USD',
'type' => 'balance',
'amount' => '1000.00'
],
'to' => [
'symbol' => 'ETH',
'type' => 'wallet',
'wallet' => [
'via' => 'ethereum',
'address' => '0xabcdef1234567890abcdef1234567890abcdef12',
'memo' => 'destination-memo',
'tag' => 'destination-tag'
]
]
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"API-Nonce: <api-key>",
"API-Sign: <api-key>",
"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.services.payward.com/v1/accounts/{account_id}/on-demand-conversions"
payload := strings.NewReader("{\n \"from\": {\n \"symbol\": \"USD\",\n \"type\": \"balance\",\n \"amount\": \"1000.00\"\n },\n \"to\": {\n \"symbol\": \"ETH\",\n \"type\": \"wallet\",\n \"wallet\": {\n \"via\": \"ethereum\",\n \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n \"memo\": \"destination-memo\",\n \"tag\": \"destination-tag\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
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.services.payward.com/v1/accounts/{account_id}/on-demand-conversions")
.header("Idempotency-Key", "<idempotency-key>")
.header("API-Key", "<api-key>")
.header("API-Sign", "<api-key>")
.header("API-Nonce", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"from\": {\n \"symbol\": \"USD\",\n \"type\": \"balance\",\n \"amount\": \"1000.00\"\n },\n \"to\": {\n \"symbol\": \"ETH\",\n \"type\": \"wallet\",\n \"wallet\": {\n \"via\": \"ethereum\",\n \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n \"memo\": \"destination-memo\",\n \"tag\": \"destination-tag\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["API-Key"] = '<api-key>'
request["API-Sign"] = '<api-key>'
request["API-Nonce"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": {\n \"symbol\": \"USD\",\n \"type\": \"balance\",\n \"amount\": \"1000.00\"\n },\n \"to\": {\n \"symbol\": \"ETH\",\n \"type\": \"wallet\",\n \"wallet\": {\n \"via\": \"ethereum\",\n \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n \"memo\": \"destination-memo\",\n \"tag\": \"destination-tag\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "00000000-0000-0000-0000-000000000009",
"status": "converting",
"from": {
"symbol": "USD",
"amount": "1000.00",
"type": "balance",
"status": "pending"
},
"to": {
"symbol": "ETH",
"amount": "0.40000000",
"type": "wallet",
"status": "pending",
"wallet": {
"via": "ethereum",
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"memo": "destination-memo",
"tag": "destination-tag"
}
},
"rate": {
"base": {
"symbol": "USD"
},
"quote": {
"symbol": "ETH"
},
"price": "0.0004"
},
"fees": {
"from": {
"symbol": "EUR",
"amount": "0.50"
},
"trade": {
"symbol": "EUR",
"amount": "0.25"
},
"to": {
"symbol": "BTC",
"amount": "0.00001"
}
},
"created_at": "2026-07-31T00:00:00Z",
"updated_at": "2026-07-31T00:00:00Z"
}
}{
"error": {
"type": "<string>",
"status": 400,
"instance": "<string>",
"code": "bad_request",
"doc_url": "<string>",
"causes": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"type": "<string>",
"status": 401,
"instance": "<string>",
"code": "unauthenticated",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 403,
"instance": "<string>",
"code": "forbidden",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 409,
"instance": "<string>",
"code": "idempotency_key_already_used",
"doc_url": "<string>",
"causes": [
{}
]
},
"conversion_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": {
"type": "<string>",
"status": 429,
"instance": "<string>",
"code": "resource_exhausted",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 500,
"instance": "<string>",
"code": "internal",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 503,
"instance": "<string>",
"code": "unavailable",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 504,
"instance": "<string>",
"code": "deadline_exceeded",
"doc_url": "<string>",
"causes": [
{}
]
}
}Create on-demand conversion
Creates an on-demand conversion for the selected account. The service calculates the missing amount and processes the conversion in the background.
curl --request POST \
--url https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions \
--header 'API-Key: <api-key>' \
--header 'API-Nonce: <api-key>' \
--header 'API-Sign: <api-key>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"from": {
"symbol": "USD",
"type": "balance",
"amount": "1000.00"
},
"to": {
"symbol": "ETH",
"type": "wallet",
"wallet": {
"via": "ethereum",
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"memo": "destination-memo",
"tag": "destination-tag"
}
}
}
'import requests
url = "https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions"
payload = {
"from": {
"symbol": "USD",
"type": "balance",
"amount": "1000.00"
},
"to": {
"symbol": "ETH",
"type": "wallet",
"wallet": {
"via": "ethereum",
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"memo": "destination-memo",
"tag": "destination-tag"
}
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'API-Key': '<api-key>',
'API-Sign': '<api-key>',
'API-Nonce': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
from: {symbol: 'USD', type: 'balance', amount: '1000.00'},
to: {
symbol: 'ETH',
type: 'wallet',
wallet: {
via: 'ethereum',
address: '0xabcdef1234567890abcdef1234567890abcdef12',
memo: 'destination-memo',
tag: 'destination-tag'
}
}
})
};
fetch('https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions', 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.services.payward.com/v1/accounts/{account_id}/on-demand-conversions",
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([
'from' => [
'symbol' => 'USD',
'type' => 'balance',
'amount' => '1000.00'
],
'to' => [
'symbol' => 'ETH',
'type' => 'wallet',
'wallet' => [
'via' => 'ethereum',
'address' => '0xabcdef1234567890abcdef1234567890abcdef12',
'memo' => 'destination-memo',
'tag' => 'destination-tag'
]
]
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"API-Nonce: <api-key>",
"API-Sign: <api-key>",
"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.services.payward.com/v1/accounts/{account_id}/on-demand-conversions"
payload := strings.NewReader("{\n \"from\": {\n \"symbol\": \"USD\",\n \"type\": \"balance\",\n \"amount\": \"1000.00\"\n },\n \"to\": {\n \"symbol\": \"ETH\",\n \"type\": \"wallet\",\n \"wallet\": {\n \"via\": \"ethereum\",\n \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n \"memo\": \"destination-memo\",\n \"tag\": \"destination-tag\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
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.services.payward.com/v1/accounts/{account_id}/on-demand-conversions")
.header("Idempotency-Key", "<idempotency-key>")
.header("API-Key", "<api-key>")
.header("API-Sign", "<api-key>")
.header("API-Nonce", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"from\": {\n \"symbol\": \"USD\",\n \"type\": \"balance\",\n \"amount\": \"1000.00\"\n },\n \"to\": {\n \"symbol\": \"ETH\",\n \"type\": \"wallet\",\n \"wallet\": {\n \"via\": \"ethereum\",\n \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n \"memo\": \"destination-memo\",\n \"tag\": \"destination-tag\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.services.payward.com/v1/accounts/{account_id}/on-demand-conversions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["API-Key"] = '<api-key>'
request["API-Sign"] = '<api-key>'
request["API-Nonce"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": {\n \"symbol\": \"USD\",\n \"type\": \"balance\",\n \"amount\": \"1000.00\"\n },\n \"to\": {\n \"symbol\": \"ETH\",\n \"type\": \"wallet\",\n \"wallet\": {\n \"via\": \"ethereum\",\n \"address\": \"0xabcdef1234567890abcdef1234567890abcdef12\",\n \"memo\": \"destination-memo\",\n \"tag\": \"destination-tag\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "00000000-0000-0000-0000-000000000009",
"status": "converting",
"from": {
"symbol": "USD",
"amount": "1000.00",
"type": "balance",
"status": "pending"
},
"to": {
"symbol": "ETH",
"amount": "0.40000000",
"type": "wallet",
"status": "pending",
"wallet": {
"via": "ethereum",
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"memo": "destination-memo",
"tag": "destination-tag"
}
},
"rate": {
"base": {
"symbol": "USD"
},
"quote": {
"symbol": "ETH"
},
"price": "0.0004"
},
"fees": {
"from": {
"symbol": "EUR",
"amount": "0.50"
},
"trade": {
"symbol": "EUR",
"amount": "0.25"
},
"to": {
"symbol": "BTC",
"amount": "0.00001"
}
},
"created_at": "2026-07-31T00:00:00Z",
"updated_at": "2026-07-31T00:00:00Z"
}
}{
"error": {
"type": "<string>",
"status": 400,
"instance": "<string>",
"code": "bad_request",
"doc_url": "<string>",
"causes": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"type": "<string>",
"status": 401,
"instance": "<string>",
"code": "unauthenticated",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 403,
"instance": "<string>",
"code": "forbidden",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 409,
"instance": "<string>",
"code": "idempotency_key_already_used",
"doc_url": "<string>",
"causes": [
{}
]
},
"conversion_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": {
"type": "<string>",
"status": 429,
"instance": "<string>",
"code": "resource_exhausted",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 500,
"instance": "<string>",
"code": "internal",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 503,
"instance": "<string>",
"code": "unavailable",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 504,
"instance": "<string>",
"code": "deadline_exceeded",
"doc_url": "<string>",
"causes": [
{}
]
}
}Authorizations
Your public API key. Identifies the partner making the request.
HMAC signature over the request, computed with your private key.
Monotonically increasing nonce included in the request signature.
Headers
UUID that identifies this create request. It must be unique. Reusing it returns a conflict error and does not create a new conversion.
Path Parameters
Identifier of the selected account that owns the conversion.
14 - 42"WVSD33HRMGSZUBM7"
Body
- Source amount
- Destination amount
Provide from.amount to specify how much to debit. Omit to.amount; the service calculates the amount delivered to the destination.
Source side of an on-demand conversion.
Show child attributes
Show child attributes
Destination side of an on-demand conversion.
- OnDemandConversionWalletDestination
- OnDemandConversionBankDestination
Show child attributes
Show child attributes
Response
On-demand conversion created.
Details of an on-demand conversion. It includes the amount debited from the source, the amount delivered to the destination, the exchange rate, destination details, and fees. Transaction references are included when available. A linked bank source remains pending during its multi-day funding window. A wallet destination may include a saved memo or tag; when present, those fields are returned in every response.
Show child attributes
Show child attributes