curl --request GET \
--url https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}', 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.12/quotes/{quoteId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
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
}
},
"pricing": {
"source": {
"asset": "usdc",
"amountGross": "100.00",
"amountNet": "100.00",
"feesDeducted": {
"total": "0.00",
"developer": "0.00",
"oms": "0.00",
"gas": "0.00"
}
},
"destination": {
"asset": "usd",
"amountGross": "100.00",
"amountNet": "100.00",
"feesDeducted": {
"total": "0.00",
"developer": "0.00",
"oms": "0.00",
"gas": "0.00"
}
},
"pair": "usdc/usd",
"exchangeRate": "1.0000",
"effectiveRate": "1.0000",
"fixedAmountSide": "source",
"sponsorGas": true,
"sponsorGasCost": "0.00"
},
"expiresAt": "2026-03-14T19:15:00Z",
"createdAt": "2026-03-14T19:00:00Z"
}Get quote by ID
Retrieves a previously created quote by ID, including its locked rate, fee breakdown, and expiry.
curl --request GET \
--url https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}', 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.12/quotes/{quoteId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.12/quotes/{quoteId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
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
}
},
"pricing": {
"source": {
"asset": "usdc",
"amountGross": "100.00",
"amountNet": "100.00",
"feesDeducted": {
"total": "0.00",
"developer": "0.00",
"oms": "0.00",
"gas": "0.00"
}
},
"destination": {
"asset": "usd",
"amountGross": "100.00",
"amountNet": "100.00",
"feesDeducted": {
"total": "0.00",
"developer": "0.00",
"oms": "0.00",
"gas": "0.00"
}
},
"pair": "usdc/usd",
"exchangeRate": "1.0000",
"effectiveRate": "1.0000",
"fixedAmountSide": "source",
"sponsorGas": true,
"sponsorGasCost": "0.00"
},
"expiresAt": "2026-03-14T19:15:00Z",
"createdAt": "2026-03-14T19:00:00Z"
}Authorizations
Token from POST /auth/token
Path Parameters
Quote ID (qt_ prefix).
Response
The request has succeeded.
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).
DEVIATION from the ratified OMS v0.12 contract (docs/specs/2026-08-05-oms-v0.12-openapi.yaml,
WalletCryptoInstrument): the ratified shape has id required and non-nullable. A row
can classify as this arm (destination_type=walletCrypto/legacy walletOms, per #2528)
before the wallet FK has actually resolved — the "in-flight deposit" window
destInstrumentKind's own doc comment describes — so id is nullable rather than
emitting an empty string that fails the typeId scalar's pattern. Not recorded in
the upstream snapshot's §4 errata (that section is for defects IN the ratified
snapshot, not BPN's own accepted deviations from it) — flagged here and in the PR
description instead, same class as the CardInstrument.id/WalletFiatInstrument.id/
BankUsInstrument.network deviations elsewhere in this same change.
^[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 travelling with the transfer on this side's rail.
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).
DEVIATION from the ratified OMS v0.12 contract (docs/specs/2026-08-05-oms-v0.12-openapi.yaml,
WalletCryptoInstrument): the ratified shape has id required and non-nullable. A row
can classify as this arm (destination_type=walletCrypto/legacy walletOms, per #2528)
before the wallet FK has actually resolved — the "in-flight deposit" window
destInstrumentKind's own doc comment describes — so id is nullable rather than
emitting an empty string that fails the typeId scalar's pattern. Not recorded in
the upstream snapshot's §4 errata (that section is for defects IN the ratified
snapshot, not BPN's own accepted deviations from it) — flagged here and in the PR
description instead, same class as the CardInstrument.id/WalletFiatInstrument.id/
BankUsInstrument.network deviations elsewhere in this same change.
^[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 travelling with the transfer on this side's rail.
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})$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
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.
Itemized fees deducted on this side.
Hide child attributes
Hide child attributes
Per-side aggregated developer fee total in this side's asset. Always "0" in alpha - alpha invariant, mirrors the gas line.
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.
Itemized fees deducted on this side.
Hide child attributes
Hide child attributes
Per-side aggregated developer fee total in this side's asset. Always "0" in alpha - alpha invariant, mirrors the gas line.
Asset pair, e.g. "usdc/usd".
Mid-market rate between source and destination assets. Identity: source.amountNet × exchangeRate = destination.amountGross.
All-in rate including all fees. Identity: source.amountGross × effectiveRate = destination.amountNet.
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?