curl --request POST \
--url https://sandbox-api.polygon.technology/v0.13/quotes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"customerId": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"source": {
"type": "walletCrypto",
"details": {
"id": "wlt_5h4jzzpr9xre3bamd9ca7qyghn",
"asset": "usdc",
"network": "polygon"
},
"amount": "100.00"
},
"destination": {
"type": "bankUs",
"details": {
"id": "ext_fky491gakzj0dd46qb6whsr2vq",
"asset": "usd",
"network": "ach"
}
},
"sponsorGas": true,
"metadata": {
"orderId": "order_12345"
}
}
'import requests
url = "https://sandbox-api.polygon.technology/v0.13/quotes"
payload = {
"customerId": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"source": {
"type": "walletCrypto",
"details": {
"id": "wlt_5h4jzzpr9xre3bamd9ca7qyghn",
"asset": "usdc",
"network": "polygon"
},
"amount": "100.00"
},
"destination": {
"type": "bankUs",
"details": {
"id": "ext_fky491gakzj0dd46qb6whsr2vq",
"asset": "usd",
"network": "ach"
}
},
"sponsorGas": True,
"metadata": { "orderId": "order_12345" }
}
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({
customerId: 'cst_vfa0nxw6zvyws9g237jrxn4y7k',
source: {
type: 'walletCrypto',
details: {id: 'wlt_5h4jzzpr9xre3bamd9ca7qyghn', asset: 'usdc', network: 'polygon'},
amount: '100.00'
},
destination: {
type: 'bankUs',
details: {id: 'ext_fky491gakzj0dd46qb6whsr2vq', asset: 'usd', network: 'ach'}
},
sponsorGas: true,
metadata: {orderId: 'order_12345'}
})
};
fetch('https://sandbox-api.polygon.technology/v0.13/quotes', 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://sandbox-api.polygon.technology/v0.13/quotes",
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([
'customerId' => 'cst_vfa0nxw6zvyws9g237jrxn4y7k',
'source' => [
'type' => 'walletCrypto',
'details' => [
'id' => 'wlt_5h4jzzpr9xre3bamd9ca7qyghn',
'asset' => 'usdc',
'network' => 'polygon'
],
'amount' => '100.00'
],
'destination' => [
'type' => 'bankUs',
'details' => [
'id' => 'ext_fky491gakzj0dd46qb6whsr2vq',
'asset' => 'usd',
'network' => 'ach'
]
],
'sponsorGas' => true,
'metadata' => [
'orderId' => 'order_12345'
]
]),
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://sandbox-api.polygon.technology/v0.13/quotes"
payload := strings.NewReader("{\n \"customerId\": \"cst_vfa0nxw6zvyws9g237jrxn4y7k\",\n \"source\": {\n \"type\": \"walletCrypto\",\n \"details\": {\n \"id\": \"wlt_5h4jzzpr9xre3bamd9ca7qyghn\",\n \"asset\": \"usdc\",\n \"network\": \"polygon\"\n },\n \"amount\": \"100.00\"\n },\n \"destination\": {\n \"type\": \"bankUs\",\n \"details\": {\n \"id\": \"ext_fky491gakzj0dd46qb6whsr2vq\",\n \"asset\": \"usd\",\n \"network\": \"ach\"\n }\n },\n \"sponsorGas\": true,\n \"metadata\": {\n \"orderId\": \"order_12345\"\n }\n}")
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://sandbox-api.polygon.technology/v0.13/quotes")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"cst_vfa0nxw6zvyws9g237jrxn4y7k\",\n \"source\": {\n \"type\": \"walletCrypto\",\n \"details\": {\n \"id\": \"wlt_5h4jzzpr9xre3bamd9ca7qyghn\",\n \"asset\": \"usdc\",\n \"network\": \"polygon\"\n },\n \"amount\": \"100.00\"\n },\n \"destination\": {\n \"type\": \"bankUs\",\n \"details\": {\n \"id\": \"ext_fky491gakzj0dd46qb6whsr2vq\",\n \"asset\": \"usd\",\n \"network\": \"ach\"\n }\n },\n \"sponsorGas\": true,\n \"metadata\": {\n \"orderId\": \"order_12345\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.13/quotes")
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 = "{\n \"customerId\": \"cst_vfa0nxw6zvyws9g237jrxn4y7k\",\n \"source\": {\n \"type\": \"walletCrypto\",\n \"details\": {\n \"id\": \"wlt_5h4jzzpr9xre3bamd9ca7qyghn\",\n \"asset\": \"usdc\",\n \"network\": \"polygon\"\n },\n \"amount\": \"100.00\"\n },\n \"destination\": {\n \"type\": \"bankUs\",\n \"details\": {\n \"id\": \"ext_fky491gakzj0dd46qb6whsr2vq\",\n \"asset\": \"usd\",\n \"network\": \"ach\"\n }\n },\n \"sponsorGas\": true,\n \"metadata\": {\n \"orderId\": \"order_12345\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "qt_0gq9aesz4wb5etdv88z1j61qcm",
"object": "quote",
"status": "open",
"sourceToDestination": "cryptoToFiatAccount",
"customerId": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"source": {
"party": {
"relationship": "customer",
"id": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"name": "Jane Smith"
},
"type": "walletCrypto",
"category": "crypto",
"id": "wlt_5h4jzzpr9xre3bamd9ca7qyghn",
"asset": "usdc",
"network": "polygon",
"displayName": "0x7B3A9F2C4D1eA8bf6390cE5D2b7fA104c8e3D9B1"
},
"destination": {
"party": {
"relationship": "externalRegistered",
"id": "ctp_yp5z8m7n22svc0vh6edqgcfdat",
"name": "Alice Smith"
},
"type": "bankUs",
"category": "fiatAccount",
"id": "ext_fky491gakzj0dd46qb6whsr2vq",
"asset": "usd",
"network": "ach",
"displayName": "••••1234",
"payoutOrigin": {
"type": "bank",
"id": null,
"accountHolder": "customer",
"accountHolderName": "Jane Smith"
}
},
"pricing": {
"source": {
"asset": "usdc",
"amountGross": "100.00",
"amountNet": "100.00"
},
"destination": {
"asset": "usd",
"amountGross": "100.00",
"amountNet": "100.00"
},
"fees": [],
"exchangeRate": "1.0000",
"fixedAmountSide": "source",
"sponsorGas": true,
"sponsorGasCost": "0.00"
},
"expiresAt": "2026-03-14T19:15:00Z",
"createdAt": "2026-03-14T19:00:00Z"
}{
"error": "CustomerRequired",
"code": 10125,
"msg": "customer_id is required",
"cause": "<string>"
}{
"error": "FeatureNotEnabled",
"code": 10153,
"msg": "cash offramp is not enabled for this partner",
"cause": "<string>"
}{
"error": "ExternalAccountNotFound",
"code": 10066,
"msg": "external account not found",
"cause": "<string>"
}{
"error": "AmbiguousAmount",
"code": 10162,
"msg": "only one of source.amount or destination.amount may be specified",
"cause": "<string>"
}{
"error": "Internal",
"code": 10124,
"msg": "internal error",
"cause": "<string>"
}{
"error": "BankRailUnavailable",
"code": 10295,
"msg": "bank payment rail is unavailable",
"cause": "<string>"
}Create a payment quote
Creates a payment quote with a locked exchange rate and fee breakdown for a prospective transfer. Quotes expire after a short window; reference the returned quote ID when executing the transaction. Pass an Idempotency-Key header to safely retry.
A disallowed source→destination instrument pair is rejected with 422 unsupportedInstrumentCombination before any quote is created; the error body carries a details object of { source, destination, supportedDestinations }. (Not modeled as a typed error arm here so the other 422 codes on this operation keep their shape.)
curl --request POST \
--url https://sandbox-api.polygon.technology/v0.13/quotes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"customerId": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"source": {
"type": "walletCrypto",
"details": {
"id": "wlt_5h4jzzpr9xre3bamd9ca7qyghn",
"asset": "usdc",
"network": "polygon"
},
"amount": "100.00"
},
"destination": {
"type": "bankUs",
"details": {
"id": "ext_fky491gakzj0dd46qb6whsr2vq",
"asset": "usd",
"network": "ach"
}
},
"sponsorGas": true,
"metadata": {
"orderId": "order_12345"
}
}
'import requests
url = "https://sandbox-api.polygon.technology/v0.13/quotes"
payload = {
"customerId": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"source": {
"type": "walletCrypto",
"details": {
"id": "wlt_5h4jzzpr9xre3bamd9ca7qyghn",
"asset": "usdc",
"network": "polygon"
},
"amount": "100.00"
},
"destination": {
"type": "bankUs",
"details": {
"id": "ext_fky491gakzj0dd46qb6whsr2vq",
"asset": "usd",
"network": "ach"
}
},
"sponsorGas": True,
"metadata": { "orderId": "order_12345" }
}
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({
customerId: 'cst_vfa0nxw6zvyws9g237jrxn4y7k',
source: {
type: 'walletCrypto',
details: {id: 'wlt_5h4jzzpr9xre3bamd9ca7qyghn', asset: 'usdc', network: 'polygon'},
amount: '100.00'
},
destination: {
type: 'bankUs',
details: {id: 'ext_fky491gakzj0dd46qb6whsr2vq', asset: 'usd', network: 'ach'}
},
sponsorGas: true,
metadata: {orderId: 'order_12345'}
})
};
fetch('https://sandbox-api.polygon.technology/v0.13/quotes', 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://sandbox-api.polygon.technology/v0.13/quotes",
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([
'customerId' => 'cst_vfa0nxw6zvyws9g237jrxn4y7k',
'source' => [
'type' => 'walletCrypto',
'details' => [
'id' => 'wlt_5h4jzzpr9xre3bamd9ca7qyghn',
'asset' => 'usdc',
'network' => 'polygon'
],
'amount' => '100.00'
],
'destination' => [
'type' => 'bankUs',
'details' => [
'id' => 'ext_fky491gakzj0dd46qb6whsr2vq',
'asset' => 'usd',
'network' => 'ach'
]
],
'sponsorGas' => true,
'metadata' => [
'orderId' => 'order_12345'
]
]),
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://sandbox-api.polygon.technology/v0.13/quotes"
payload := strings.NewReader("{\n \"customerId\": \"cst_vfa0nxw6zvyws9g237jrxn4y7k\",\n \"source\": {\n \"type\": \"walletCrypto\",\n \"details\": {\n \"id\": \"wlt_5h4jzzpr9xre3bamd9ca7qyghn\",\n \"asset\": \"usdc\",\n \"network\": \"polygon\"\n },\n \"amount\": \"100.00\"\n },\n \"destination\": {\n \"type\": \"bankUs\",\n \"details\": {\n \"id\": \"ext_fky491gakzj0dd46qb6whsr2vq\",\n \"asset\": \"usd\",\n \"network\": \"ach\"\n }\n },\n \"sponsorGas\": true,\n \"metadata\": {\n \"orderId\": \"order_12345\"\n }\n}")
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://sandbox-api.polygon.technology/v0.13/quotes")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"cst_vfa0nxw6zvyws9g237jrxn4y7k\",\n \"source\": {\n \"type\": \"walletCrypto\",\n \"details\": {\n \"id\": \"wlt_5h4jzzpr9xre3bamd9ca7qyghn\",\n \"asset\": \"usdc\",\n \"network\": \"polygon\"\n },\n \"amount\": \"100.00\"\n },\n \"destination\": {\n \"type\": \"bankUs\",\n \"details\": {\n \"id\": \"ext_fky491gakzj0dd46qb6whsr2vq\",\n \"asset\": \"usd\",\n \"network\": \"ach\"\n }\n },\n \"sponsorGas\": true,\n \"metadata\": {\n \"orderId\": \"order_12345\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.13/quotes")
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 = "{\n \"customerId\": \"cst_vfa0nxw6zvyws9g237jrxn4y7k\",\n \"source\": {\n \"type\": \"walletCrypto\",\n \"details\": {\n \"id\": \"wlt_5h4jzzpr9xre3bamd9ca7qyghn\",\n \"asset\": \"usdc\",\n \"network\": \"polygon\"\n },\n \"amount\": \"100.00\"\n },\n \"destination\": {\n \"type\": \"bankUs\",\n \"details\": {\n \"id\": \"ext_fky491gakzj0dd46qb6whsr2vq\",\n \"asset\": \"usd\",\n \"network\": \"ach\"\n }\n },\n \"sponsorGas\": true,\n \"metadata\": {\n \"orderId\": \"order_12345\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "qt_0gq9aesz4wb5etdv88z1j61qcm",
"object": "quote",
"status": "open",
"sourceToDestination": "cryptoToFiatAccount",
"customerId": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"source": {
"party": {
"relationship": "customer",
"id": "cst_vfa0nxw6zvyws9g237jrxn4y7k",
"name": "Jane Smith"
},
"type": "walletCrypto",
"category": "crypto",
"id": "wlt_5h4jzzpr9xre3bamd9ca7qyghn",
"asset": "usdc",
"network": "polygon",
"displayName": "0x7B3A9F2C4D1eA8bf6390cE5D2b7fA104c8e3D9B1"
},
"destination": {
"party": {
"relationship": "externalRegistered",
"id": "ctp_yp5z8m7n22svc0vh6edqgcfdat",
"name": "Alice Smith"
},
"type": "bankUs",
"category": "fiatAccount",
"id": "ext_fky491gakzj0dd46qb6whsr2vq",
"asset": "usd",
"network": "ach",
"displayName": "••••1234",
"payoutOrigin": {
"type": "bank",
"id": null,
"accountHolder": "customer",
"accountHolderName": "Jane Smith"
}
},
"pricing": {
"source": {
"asset": "usdc",
"amountGross": "100.00",
"amountNet": "100.00"
},
"destination": {
"asset": "usd",
"amountGross": "100.00",
"amountNet": "100.00"
},
"fees": [],
"exchangeRate": "1.0000",
"fixedAmountSide": "source",
"sponsorGas": true,
"sponsorGasCost": "0.00"
},
"expiresAt": "2026-03-14T19:15:00Z",
"createdAt": "2026-03-14T19:00:00Z"
}{
"error": "CustomerRequired",
"code": 10125,
"msg": "customer_id is required",
"cause": "<string>"
}{
"error": "FeatureNotEnabled",
"code": 10153,
"msg": "cash offramp is not enabled for this partner",
"cause": "<string>"
}{
"error": "ExternalAccountNotFound",
"code": 10066,
"msg": "external account not found",
"cause": "<string>"
}{
"error": "AmbiguousAmount",
"code": 10162,
"msg": "only one of source.amount or destination.amount may be specified",
"cause": "<string>"
}{
"error": "Internal",
"code": 10124,
"msg": "internal error",
"cause": "<string>"
}{
"error": "BankRailUnavailable",
"code": 10295,
"msg": "bank payment rail is unavailable",
"cause": "<string>"
}Authorizations
Token from POST /auth/token
Headers
Required on POST and PUT requests. Use a unique value per logical mutation attempt, for example a UUID.
Body
Request body for creating a quote. Pick a type on each side and set the amount on exactly one side; OMS calculates the other.
The customer this quote is for (cst_ prefix).
What funds the transaction. Pick a type: an OMS crypto wallet (walletCrypto) or a registered card (card, pull-from-card).
- OMS wallet
- Fiat wallet
- Card
Hide child attributes
Hide child attributes
Type discriminator.
walletCrypto Wire-safe decimal string for financial float values (USD amounts, percentages).
The instrument that receives the funds. Pick a type: a wallet (walletCrypto / walletExternal), a bank account (bankUs / bankIban / bankCanada), a card, or cash.
- OMS wallet
- External wallet
- US bank account
- IBAN bank account
- Canadian bank account
- Card
- Cash
Hide child attributes
Hide child attributes
Type discriminator.
walletCrypto Wire-safe decimal string for financial float values (USD amounts, percentages).
When true, OMS absorbs the on-chain gas cost for the destination delivery. Only true is currently supported. Ignored for non-crypto destinations (no on-chain leg).
Where a card-rail quote settles the crypto: external delivers it to an on-chain wallet, internal settles it into the customer's OMS-custodied walletCrypto, whose provider names the custodian. Ignored on every non-card rail. A card buy defaults to external; internal alongside a walletExternal destination is rejected with 400 invalidWalletTarget. A card sell is always internal; an explicit external is rejected with 422 externalSellUnsupported.
internal, external Response
The request has succeeded and a new resource has been created as a result.
A price quote for moving money between two instruments. It locks an exchange rate and the amounts for a short window; execute it by creating a transaction that references this quote's id.
Quote ID (qt_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Resource type discriminator. Always "quote".
quote Current status of the quote.
open, accepted, expired The OMS customer that owns this record (cst_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$The funding side, echoed from the request with resolved instrument detail.
- OMS wallet
- External wallet
- Fiat wallet
- US bank account
- IBAN bank account
- Canadian bank account
- Card
- Cash
Hide child attributes
Hide child attributes
Type discriminator.
walletCrypto High-level grouping: fiatAccount for bank or card accounts, crypto for wallets.
crypto OMS wallet ID (wlt_ prefix). Dereference via GET /wallets/{id}. Null while a deposit is still in flight and the wallet it lands in has not resolved yet.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Canonical asset identifier.
Network identifier.
Opaque, render-only summary for list/detail display. Never a full account number/IBAN/PAN.
Structured identity of who is on this side.
Hide child attributes
Hide child attributes
Which kind of party this is.
customer, otherCustomer, externalRegistered, externalUnregistered cst_ for customer/otherCustomer; ctp_ for externalRegistered; null for externalUnregistered.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Display name. Null only when genuinely unknown (an unattributed external sender).
Free-text message that travelled with the transfer on this side's rail. Never populated on this instrument — no rail behind it carries a message — so the key is always absent. A memo appears only on the bank arms (bankUs, bankIban, bankCanada).
The receiving side, echoed from the request with resolved instrument detail.
- OMS wallet
- External wallet
- Fiat wallet
- US bank account
- IBAN bank account
- Canadian bank account
- Card
- Cash
Hide child attributes
Hide child attributes
Type discriminator.
walletCrypto High-level grouping: fiatAccount for bank or card accounts, crypto for wallets.
crypto OMS wallet ID (wlt_ prefix). Dereference via GET /wallets/{id}. Null while a deposit is still in flight and the wallet it lands in has not resolved yet.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Canonical asset identifier.
Network identifier.
Opaque, render-only summary for list/detail display. Never a full account number/IBAN/PAN.
Structured identity of who is on this side.
Hide child attributes
Hide child attributes
Which kind of party this is.
customer, otherCustomer, externalRegistered, externalUnregistered cst_ for customer/otherCustomer; ctp_ for externalRegistered; null for externalUnregistered.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Display name. Null only when genuinely unknown (an unattributed external sender).
Free-text message that travelled with the transfer on this side's rail. Never populated on this instrument — no rail behind it carries a message — so the key is always absent. A memo appears only on the bank arms (bankUs, bankIban, bankCanada).
Where last-mile delivery is sent from, as a uniform {type, id} reference — response-only. id is the Virtual Account (va_) or OMS wallet (wlt_) funding the leg; null before execution (Quote / Deposit Address echo the choice only) or when the origin has no partner-visible resource. Rail identifiers for the last-mile transfer live in the top-level tracking array with leg: destination — not here.
Hide child attributes
Hide child attributes
bank, blockchain Public TypeID, e.g. txn_01h455vb4pex5vsknk084sn02q; legacy UUID suffixes are accepted until non-v7 rows are retired.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Whose legal identity the payment is sent under. Determined by OMS from the route's configuration — not a request field. Null for destinations that have no sending legal identity (crypto and cash payouts).
customer, paymentProvider The legal name the payment is sent under, resolved from accountHolder — the customer's own legal name for customer, or "Coinme Inc FBO its Customers" for paymentProvider. This is what the recipient's bank shows on the credit. Like accountHolder and unlike id, it is populated as soon as it is determinable, so it appears on Quote and Deposit Address responses as well as Transactions. Null whenever accountHolder is null.
Echo of the ACH companyDiscretionaryData supplied on the originating request. Null/absent on non-ACH destinations or when not supplied.
Consolidated economics.
Hide child attributes
Hide child attributes
Every fee deducted across both sides. [] when there are none — never omitted, never null.
Hide child attributes
Hide child attributes
Fee kind. OPEN — clients must tolerate an unrecognised type. Known values today: "developer" (always 0 in alpha), "oms", "gas".
Which side this fee was deducted from.
source, destination Currency this fee is denominated in — that side's asset.
Fee amount, in asset.
Economics for the source side, denominated in the source asset.
Hide child attributes
Hide child attributes
Currency these amounts are in. Same as the side's instrument asset, repeated here so pricing is self-contained.
Amount on this side before fees are applied.
Amount after fees: what is actually pulled from a source, or delivered to a destination. Identity: amountNet = amountGross − Σ fees(side) (this side's entries in Pricing.fees).
Economics for the destination side, denominated in the destination asset.
Hide child attributes
Hide child attributes
Currency these amounts are in. Same as the side's instrument asset, repeated here so pricing is self-contained.
Amount on this side before fees are applied.
Amount after fees: what is actually pulled from a source, or delivered to a destination. Identity: amountNet = amountGross − Σ fees(side) (this side's entries in Pricing.fees).
Mid-market rate between source and destination assets. Identity: source.amountNet × exchangeRate = destination.amountGross.
The side you set amount on when creating the quote. OMS calculated the other side.
source, destination When true, OMS absorbs the destination gas cost. Currently always true.
Gas absorbed by the developer when sponsorGas is true. Currently always 0.00.
Corridor composite derived from the two sides.
cryptoToCrypto, cryptoToCash, cryptoToFiatAccount, cashToCrypto, fiatAccountToCrypto, fiatAccountToFiatAccount When the locked pricing expires.
When the quote was created.
Was this page helpful?