Get a wallet statement
Returns what the wallet held in one asset at the start and the end of a period, and every ledger entry between, oldest first. Give from and to as UTC days; both are included, to must be fully in the past, and the period holds at most 92 days. The wallet is on one chain, so no chain is named; an asset that is not on it returns 400 UNSUPPORTED_ASSET. Follow meta.nextCursor for the next page; opening and closing cover the whole period on every page.
curl --request GET \
--url https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement', 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://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-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"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"account": {
"type": "wallet",
"id": "<string>"
},
"asset": {
"code": "USD",
"chain": "ethereum"
},
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"opening": {
"available": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"pending": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"frozen": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
}
},
"closing": {
"available": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"pending": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"frozen": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
}
},
"lines": [
{
"at": "2026-01-15T09:30:00.000Z",
"bucket": "available",
"direction": "credit",
"amount": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"kind": "principal",
"transactionId": "<string>",
"transactionType": "deposit"
}
],
"meta": {
"mode": "cursor",
"nextCursor": "eyJpZCI6ImN1c18yeFBxTjhSIn0"
}
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "ORGANIZATION_ACCESS_SUSPENDED",
"title": "Organization Access Suspended",
"status": 403,
"detail": "Conduit has suspended this organization's access. Requests with the organization's API keys and from its users are refused until Conduit restores access.",
"resolution": "Contact Conduit support.",
"docs": "https://conduit-v2.mintlify.app/errors#organization-access-suspended",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "WALLET_NOT_FOUND",
"title": "Wallet Not Found",
"status": 404,
"detail": "No wallet exists with the specified ID, or the wallet belongs to a different organization.",
"resolution": "Verify the wallet ID is correct. Use the list wallets endpoint to find valid wallet IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#wallet-not-found",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit (the bucket size), X-RateLimit-Remaining, and X-RateLimit-Reset (seconds until the bucket refills) on every response once your API key is accepted.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}Authorizations
Path Parameters
"cus_1A2b3C4d5E6f7G8h9I0jKl"
"wlt_1A2b3C4d5E6f7G8h9I0jKl"
Query Parameters
The first UTC day the statement covers, as YYYY-MM-DD. The day is included.
The last UTC day the statement covers, as YYYY-MM-DD. The day is included and must be fully in the past. The period holds at most 92 days.
Opaque cursor from a previous response. Send meta.nextCursor with the same query to read the next page. A statement reads forward only.
The asset the statement covers, as an asset code. Case-insensitive. The wallet is on one chain, so the chain is not a parameter.
USD, EUR, GBP, CHF, JPY, CAD, AUD, NZD, SGD, HKD, CNY, KRW, INR, BRL, MXN, ARS, CLP, COP, PEN, ZAR, NGN, KES, GHS, EGP, AED, SAR, ILS, TRY, PLN, CZK, HUF, SEK, NOK, DKK, THB, IDR, MYR, PHP, VND, TWD, USDC, USDT, DAI, EURC, PYUSD, OUSD, BTC, ETH, SOL, TRX, XLM, POL Response
What an account held at the start and the end of a period, and every entry between.
The account the statement covers.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The UTC days the statement covers. Both days are included.
Show child attributes
Show child attributes
What the account held at the start of the first day.
Show child attributes
Show child attributes
What the account held at the end of the last day.
Show child attributes
Show child attributes
One page of entries, oldest first. opening and closing cover the whole period on every page.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
curl --request GET \
--url https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement', 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://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-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"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/customers/{customerId}/wallets/{walletId}/statement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"account": {
"type": "wallet",
"id": "<string>"
},
"asset": {
"code": "USD",
"chain": "ethereum"
},
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"opening": {
"available": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"pending": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"frozen": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
}
},
"closing": {
"available": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"pending": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"frozen": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
}
},
"lines": [
{
"at": "2026-01-15T09:30:00.000Z",
"bucket": "available",
"direction": "credit",
"amount": {
"code": "USD",
"amount": "<string>",
"chain": "ethereum"
},
"kind": "principal",
"transactionId": "<string>",
"transactionType": "deposit"
}
],
"meta": {
"mode": "cursor",
"nextCursor": "eyJpZCI6ImN1c18yeFBxTjhSIn0"
}
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "ORGANIZATION_ACCESS_SUSPENDED",
"title": "Organization Access Suspended",
"status": 403,
"detail": "Conduit has suspended this organization's access. Requests with the organization's API keys and from its users are refused until Conduit restores access.",
"resolution": "Contact Conduit support.",
"docs": "https://conduit-v2.mintlify.app/errors#organization-access-suspended",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "WALLET_NOT_FOUND",
"title": "Wallet Not Found",
"status": 404,
"detail": "No wallet exists with the specified ID, or the wallet belongs to a different organization.",
"resolution": "Verify the wallet ID is correct. Use the list wallets endpoint to find valid wallet IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#wallet-not-found",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit (the bucket size), X-RateLimit-Remaining, and X-RateLimit-Reset (seconds until the bucket refills) on every response once your API key is accepted.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}