curl --request GET \
--url https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timelineimport requests
url = "https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timeline"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timeline', 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/{paymentId}/timeline",
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/{paymentId}/timeline"
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/{paymentId}/timeline")
.asString();require 'uri'
require 'net/http'
url = URI("https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timeline")
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{
"payment_id": "0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
"status": "pending",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"steps": [
{
"name": "BID_AWARDED",
"label": "Best Bid Selected",
"status": "completed",
"timestamp": "2023-11-07T05:31:56Z",
"duration_ms": 123,
"chain_id": "eip155:1",
"transaction_hash": "<string>",
"details": {}
}
],
"transactions": {
"deposit": {
"transaction_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"chain_id": "eip155:42161",
"block_number": 61234567
},
"fulfillment": {
"transaction_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"chain_id": "eip155:42161",
"block_number": 61234567
}
},
"total_duration_ms": 123,
"summary": {
"source_asset": "eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"source_account": "0x742D35cC6634c0532925a3b844Bc9e7595F41360",
"dest_asset": "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"dest_account": "0x892BB2e4F6b14a2B5b82Ba8d33E5925D42D4431F",
"fulfillment_amount": "1000000",
"display_amount": "1.00 USDC",
"max_source_amount": "1005000",
"request_id": "req_123456789"
},
"error": {
"code": "SETTLEMENT_FAILED",
"message": "No quotes received within the auction window",
"domain": "PAYMENT_GATEWAY",
"docs_url": "<string>",
"retry_classification": "RECONCILE_THEN_DECIDE",
"request_id_reusable": false,
"blockchain_context": {
"chain_id": "<string>",
"transaction_hash": "<string>",
"block_number": 123,
"contract_address": "<string>",
"revert_reason": "<string>",
"gas_used": "<string>",
"estimated_gas_needed": "<string>"
}
}
}{
"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 payment timeline
Read the step-by-step settlement record for one payment. Use it for reconciliation and support, not to decide what to do next.
curl --request GET \
--url https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timelineimport requests
url = "https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timeline"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timeline', 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/{paymentId}/timeline",
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/{paymentId}/timeline"
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/{paymentId}/timeline")
.asString();require 'uri'
require 'net/http'
url = URI("https://payment-gw.production-mainnet.atum.xyz/v1/payments/{paymentId}/timeline")
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{
"payment_id": "0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
"status": "pending",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"steps": [
{
"name": "BID_AWARDED",
"label": "Best Bid Selected",
"status": "completed",
"timestamp": "2023-11-07T05:31:56Z",
"duration_ms": 123,
"chain_id": "eip155:1",
"transaction_hash": "<string>",
"details": {}
}
],
"transactions": {
"deposit": {
"transaction_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"chain_id": "eip155:42161",
"block_number": 61234567
},
"fulfillment": {
"transaction_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"chain_id": "eip155:42161",
"block_number": 61234567
}
},
"total_duration_ms": 123,
"summary": {
"source_asset": "eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"source_account": "0x742D35cC6634c0532925a3b844Bc9e7595F41360",
"dest_asset": "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"dest_account": "0x892BB2e4F6b14a2B5b82Ba8d33E5925D42D4431F",
"fulfillment_amount": "1000000",
"display_amount": "1.00 USDC",
"max_source_amount": "1005000",
"request_id": "req_123456789"
},
"error": {
"code": "SETTLEMENT_FAILED",
"message": "No quotes received within the auction window",
"domain": "PAYMENT_GATEWAY",
"docs_url": "<string>",
"retry_classification": "RECONCILE_THEN_DECIDE",
"request_id_reusable": false,
"blockchain_context": {
"chain_id": "<string>",
"transaction_hash": "<string>",
"block_number": 123,
"contract_address": "<string>",
"revert_reason": "<string>",
"gas_used": "<string>",
"estimated_gas_needed": "<string>"
}
}
}{
"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
}status from payment status instead. See Reconciliation.Path Parameters
The ID of the payment to query
Response
Timeline retrieved successfully
Step-by-step view of a payment's settlement lifecycle. Includes a route summary, a list of steps with timings, and if the payment failed, a structured error describing where and why.
"0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f"
Where your payment is in its lifecycle. One payment reads the same however you ask about it.
pending: accepted and in progress. Nothing has reached the recipient yet.finalizing: the transaction paying your recipient is on chain and is accruing the confirmations its chain requires. NOT FINAL, see below.completed: delivered, with the required confirmations behind it.failed: did not complete. Any funds held in escrow are returned, anderrordescribes what went wrong.
completed and failed are final and will not change afterwards. pending and
finalizing will.
Do not treat finalizing as delivered. It says the payment has been made on
chain but is not yet irreversible, much as a card authorization is not yet a
settlement. It normally becomes completed, and it can still become failed if
the transaction never reaches the confirmation depth its chain requires. Acting on
finalizing — releasing goods, crediting an account — means accepting that risk
deliberately, at whatever threshold suits you rather than the one we wait for.
finalizing is about paying the recipient. While your own funds are still being
committed on the source chain the payment is pending, because nothing has reached
the recipient yet.
pending, finalizing, completed, failed "pending"
Show child attributes
Show child attributes
The transactions a payment has produced, one entry per stage, added as each becomes known. A stage absent here has produced no transaction yet.
These are the two movements that decide whether your payment happened: your funds
being committed, and your recipient being paid. Present on every outcome, so a
payment that did not complete can still be traced on chain.
fulfillment_confirmation is not a substitute: it is written only once a payment
completes, and describes the finished delivery rather than progress towards it.
Where a stage is attempted more than once, the entry describes the attempt that counts — the one that succeeded, or the last one if none did.
Show child attributes
Show child attributes
Total time from first step to last completed step (only set for terminal states)
Top-level context about the payment (parties, assets, amounts)
Show child attributes
Show child attributes
Why a payment failed. Present only when status is failed, and identical
however you ask about the payment.
code is the stable, machine-readable identity of the failure — branch on it
rather than on message, which is written for a person and may be reworded.
docs_url points at the page describing that code.
Show child attributes
Show child attributes