curl --request POST \
--url https://v2.prod.halliday.xyz/payments/balances \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": {
"source": "OWNER",
"owner": "0xabc1234567890abcdef1234567890abcdef1234",
"scope": {
"kind": "PAYMENT",
"payment_id": "41b16a6f-704e-44ba-9964-2b66df8a73e8"
},
"tokens": [
"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
]
}
}
'import requests
url = "https://v2.prod.halliday.xyz/payments/balances"
payload = { "query": {
"source": "OWNER",
"owner": "0xabc1234567890abcdef1234567890abcdef1234",
"scope": {
"kind": "PAYMENT",
"payment_id": "41b16a6f-704e-44ba-9964-2b66df8a73e8"
},
"tokens": ["ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"]
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: {
source: 'OWNER',
owner: '0xabc1234567890abcdef1234567890abcdef1234',
scope: {kind: 'PAYMENT', payment_id: '41b16a6f-704e-44ba-9964-2b66df8a73e8'},
tokens: ['ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48']
}
})
};
fetch('https://v2.prod.halliday.xyz/payments/balances', 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://v2.prod.halliday.xyz/payments/balances",
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([
'query' => [
'source' => 'OWNER',
'owner' => '0xabc1234567890abcdef1234567890abcdef1234',
'scope' => [
'kind' => 'PAYMENT',
'payment_id' => '41b16a6f-704e-44ba-9964-2b66df8a73e8'
],
'tokens' => [
'ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://v2.prod.halliday.xyz/payments/balances"
payload := strings.NewReader("{\n \"query\": {\n \"source\": \"OWNER\",\n \"owner\": \"0xabc1234567890abcdef1234567890abcdef1234\",\n \"scope\": {\n \"kind\": \"PAYMENT\",\n \"payment_id\": \"41b16a6f-704e-44ba-9964-2b66df8a73e8\"\n },\n \"tokens\": [\n \"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://v2.prod.halliday.xyz/payments/balances")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": {\n \"source\": \"OWNER\",\n \"owner\": \"0xabc1234567890abcdef1234567890abcdef1234\",\n \"scope\": {\n \"kind\": \"PAYMENT\",\n \"payment_id\": \"41b16a6f-704e-44ba-9964-2b66df8a73e8\"\n },\n \"tokens\": [\n \"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://v2.prod.halliday.xyz/payments/balances")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": {\n \"source\": \"OWNER\",\n \"owner\": \"0xabc1234567890abcdef1234567890abcdef1234\",\n \"scope\": {\n \"kind\": \"PAYMENT\",\n \"payment_id\": \"41b16a6f-704e-44ba-9964-2b66df8a73e8\"\n },\n \"tokens\": [\n \"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"balance_results": [
{
"address": "0x4f2e8c1a9b7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f",
"token": "ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"value": {
"kind": "amount",
"amount": "25.5",
"withdrawal_fee": null,
"min_withdrawal_amount": null
},
"withdraw_from": {
"withdraw_type": "PAYMENT",
"payment_id": "41b16a6f-704e-44ba-9964-2b66df8a73e8",
"withdraw_account": "SPW"
},
"payment_gist": null
}
],
"future_withdrawable_balances": []
}{
"errors": [
{
"kind": "other",
"message": "Invalid wallet address format"
}
]
}{
"errors": [
{
"kind": "other",
"message": "Invalid API key"
}
]
}{
"errors": [
{
"kind": "other",
"message": "You do not have permission to query payment balances"
}
]
}{
"errors": [
{
"kind": "other",
"message": "Payment 'pay_abc123' not found"
}
]
}Get wallet balances
Retrieve token balances held at Halliday deposit addresses.
Use an OWNER query with a PAYMENT scope to check the deposit addresses of one payment. The API
derives the payment’s deposit address on each requested token’s chain, including chains that are
not in the payment’s processing_addresses, and returns a withdraw_from object for each balance
that can be passed to POST /payments/withdraw. When tokens is omitted, only the tokens and
chains on the payment’s own route are checked, so pass the specific token to look for. Funds sent
into a cross-chain bridge deposit that did not complete are listed in future_withdrawable_balances
and become withdrawable after their deadline.
Use an OWNER query with an EXTRA scope to find balances at the owner’s reusable deposit wallets
that are not attributed to a payment, or an EXTERNAL query to read the balance of arbitrary
address and token pairs.
curl --request POST \
--url https://v2.prod.halliday.xyz/payments/balances \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": {
"source": "OWNER",
"owner": "0xabc1234567890abcdef1234567890abcdef1234",
"scope": {
"kind": "PAYMENT",
"payment_id": "41b16a6f-704e-44ba-9964-2b66df8a73e8"
},
"tokens": [
"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
]
}
}
'import requests
url = "https://v2.prod.halliday.xyz/payments/balances"
payload = { "query": {
"source": "OWNER",
"owner": "0xabc1234567890abcdef1234567890abcdef1234",
"scope": {
"kind": "PAYMENT",
"payment_id": "41b16a6f-704e-44ba-9964-2b66df8a73e8"
},
"tokens": ["ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"]
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: {
source: 'OWNER',
owner: '0xabc1234567890abcdef1234567890abcdef1234',
scope: {kind: 'PAYMENT', payment_id: '41b16a6f-704e-44ba-9964-2b66df8a73e8'},
tokens: ['ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48']
}
})
};
fetch('https://v2.prod.halliday.xyz/payments/balances', 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://v2.prod.halliday.xyz/payments/balances",
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([
'query' => [
'source' => 'OWNER',
'owner' => '0xabc1234567890abcdef1234567890abcdef1234',
'scope' => [
'kind' => 'PAYMENT',
'payment_id' => '41b16a6f-704e-44ba-9964-2b66df8a73e8'
],
'tokens' => [
'ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://v2.prod.halliday.xyz/payments/balances"
payload := strings.NewReader("{\n \"query\": {\n \"source\": \"OWNER\",\n \"owner\": \"0xabc1234567890abcdef1234567890abcdef1234\",\n \"scope\": {\n \"kind\": \"PAYMENT\",\n \"payment_id\": \"41b16a6f-704e-44ba-9964-2b66df8a73e8\"\n },\n \"tokens\": [\n \"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://v2.prod.halliday.xyz/payments/balances")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": {\n \"source\": \"OWNER\",\n \"owner\": \"0xabc1234567890abcdef1234567890abcdef1234\",\n \"scope\": {\n \"kind\": \"PAYMENT\",\n \"payment_id\": \"41b16a6f-704e-44ba-9964-2b66df8a73e8\"\n },\n \"tokens\": [\n \"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://v2.prod.halliday.xyz/payments/balances")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": {\n \"source\": \"OWNER\",\n \"owner\": \"0xabc1234567890abcdef1234567890abcdef1234\",\n \"scope\": {\n \"kind\": \"PAYMENT\",\n \"payment_id\": \"41b16a6f-704e-44ba-9964-2b66df8a73e8\"\n },\n \"tokens\": [\n \"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"balance_results": [
{
"address": "0x4f2e8c1a9b7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f",
"token": "ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"value": {
"kind": "amount",
"amount": "25.5",
"withdrawal_fee": null,
"min_withdrawal_amount": null
},
"withdraw_from": {
"withdraw_type": "PAYMENT",
"payment_id": "41b16a6f-704e-44ba-9964-2b66df8a73e8",
"withdraw_account": "SPW"
},
"payment_gist": null
}
],
"future_withdrawable_balances": []
}{
"errors": [
{
"kind": "other",
"message": "Invalid wallet address format"
}
]
}{
"errors": [
{
"kind": "other",
"message": "Invalid API key"
}
]
}{
"errors": [
{
"kind": "other",
"message": "You do not have permission to query payment balances"
}
]
}{
"errors": [
{
"kind": "other",
"message": "Payment 'pay_abc123' not found"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
- Option 1
- Option 2
Show child attributes
Show child attributes
Response
Wallet balances retrieved successfully
- Option 1
- Option 2
Shape depends on the request's query.source. OWNER queries return OwnerBalancesResponse, EXTERNAL queries return ExternalBalancesResponse.

