curl --request GET \
--url https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}import requests
url = "https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}', 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://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"quote_request_id": "qr_a1b2c3d4-5678-90ef-1234-567890abcdef",
"status": "awarded",
"quotes": [
{
"quote_id": "0x9a3b...e8d4",
"fulfillment_quote": {},
"awarded_payment_id": "0x761989729fefb4b0cb8b3e6f787301a3878c91e8fba35ed362a079292879f34f"
}
],
"payments": [
{
"quote_id": "0x9a3b...e8d4",
"payment_id": "0x761989729fefb4b0cb8b3e6f787301a3878c91e8fba35ed362a079292879f34f"
}
],
"requested_count": 8,
"decline_summary": [
{
"reason": "INSUFFICIENT_LIQUIDITY",
"count": 4,
"retry_classification": "RETRY_AFTER_DELAY",
"docs_url": "https://docs.atum.xyz/decline-reasons#insufficient-liquidity"
}
]
}{
"code": "INVALID_SOURCE_ASSET",
"message": "The source asset identifier is not a valid CAIP-19 asset.",
"request_id": "req_123456789",
"payment_id": "0xc7108e200d11580e7e75185991084b42a535af588ba8267cd0d1e7df089e5c9c",
"docs_url": "<string>",
"domain": "PAYMENT_GATEWAY",
"retry_classification": "RECONCILE_THEN_DECIDE",
"request_id_reusable": false
}{
"code": "INVALID_SOURCE_ASSET",
"message": "The source asset identifier is not a valid CAIP-19 asset.",
"request_id": "req_123456789",
"payment_id": "0xc7108e200d11580e7e75185991084b42a535af588ba8267cd0d1e7df089e5c9c",
"docs_url": "<string>",
"domain": "PAYMENT_GATEWAY",
"retry_classification": "RECONCILE_THEN_DECIDE",
"request_id_reusable": false
}Get quote-request status
Read a quote-request batch and the quotes collected for it so far.
curl --request GET \
--url https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}import requests
url = "https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}', 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://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://payment-gw.production-mainnet.atum.xyz/v1/payments/quote-requests/{quoteRequestId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"quote_request_id": "qr_a1b2c3d4-5678-90ef-1234-567890abcdef",
"status": "awarded",
"quotes": [
{
"quote_id": "0x9a3b...e8d4",
"fulfillment_quote": {},
"awarded_payment_id": "0x761989729fefb4b0cb8b3e6f787301a3878c91e8fba35ed362a079292879f34f"
}
],
"payments": [
{
"quote_id": "0x9a3b...e8d4",
"payment_id": "0x761989729fefb4b0cb8b3e6f787301a3878c91e8fba35ed362a079292879f34f"
}
],
"requested_count": 8,
"decline_summary": [
{
"reason": "INSUFFICIENT_LIQUIDITY",
"count": 4,
"retry_classification": "RETRY_AFTER_DELAY",
"docs_url": "https://docs.atum.xyz/decline-reasons#insufficient-liquidity"
}
]
}{
"code": "INVALID_SOURCE_ASSET",
"message": "The source asset identifier is not a valid CAIP-19 asset.",
"request_id": "req_123456789",
"payment_id": "0xc7108e200d11580e7e75185991084b42a535af588ba8267cd0d1e7df089e5c9c",
"docs_url": "<string>",
"domain": "PAYMENT_GATEWAY",
"retry_classification": "RECONCILE_THEN_DECIDE",
"request_id_reusable": false
}{
"code": "INVALID_SOURCE_ASSET",
"message": "The source asset identifier is not a valid CAIP-19 asset.",
"request_id": "req_123456789",
"payment_id": "0xc7108e200d11580e7e75185991084b42a535af588ba8267cd0d1e7df089e5c9c",
"docs_url": "<string>",
"domain": "PAYMENT_GATEWAY",
"retry_classification": "RECONCILE_THEN_DECIDE",
"request_id_reusable": false
}request_id returns the original batch. See Idempotency.Path Parameters
The ID of the quote-request batch to query
Response
Quote-request status retrieved successfully
Response to GET /v1/payments/quote-requests/{quoteRequestId}. The status enum describes
the quote-request batch lifecycle and is disjoint from the payment-status enum.
"qr_a1b2c3d4-5678-90ef-1234-567890abcdef"
Derived batch lifecycle, computed at read time (not a stored state machine). Disjoint from the payment-status enum returned by the award and payment-status endpoints.
collecting— collection window still open;quoteslists those collected so far (a quote is awardable from arrival, by its ownaward_deadline; more may arrive untilcollection_close).ready— collection complete; none awarded yet; either at least one quote is still within itsaward_deadline, or no settler bid (emptyquotesarray — the successful "no quotes available" result).awarded— a quote produced a payment row; no further awards accepted (MVP).expired— collection closed, nothing awarded, and every collected quote is now past itsaward_deadline("quotes lapsed"). An empty batch isready, notexpired— the two are deliberately distinct ("no quotes available" vs "quotes lapsed").
collecting, ready, awarded, expired "awarded"
Collected quotes with award linkage — those collected so far while collecting, the full set once the window closes.
Show child attributes
Show child attributes
Flat list of awarded (quote_id, payment_id) pairs. At most one entry under MVP single-award.
Show child attributes
Show child attributes
How many agents the request was broadcast to. The only auction count that is not derivable from the rest of this response:
- quoted =
quoteslength - declined = sum of
decline_summary[].count - participated = quoted + declined
- silent =
requested_count- participated
Silence and a decline are different signals, which is why the denominator is surfaced rather than left implicit.
ABSENT when the number is unknown, which happens when the broadcast count was never
recorded or when the auction detail could not be read. Absence means unknown, never zero,
so silent is derivable only when this field is present.
8
Why the request drew few or no quotes, so a caller can tell "nobody can fund this right now" from "my request was malformed".
EXHAUSTIVE over agents: every agent that declined is counted exactly once, under its most recent reason, so the counts sum to the number of agents that declined. An agent that declined more than once with different reasons is counted once, not once per reason.
Empty means nobody declined. ABSENT means the auction detail could not be read, so the
breakdown is unknown. While status is collecting it is provisional, because agents are
still responding.
The free-form decline detail is never relayed, because that detail carries an agent's balances and would let a caller map inventory by polling cheap quote-requests across corridors.
Show child attributes
Show child attributes