List Statements
Lists the balance movements caused by API operations (payins, payouts, their fees, payout refunds and deposit reversals), newest first.
Movements made only in the panel are not returned. Without dates, the last 30 days are returned; the widest range accepted is 90 days (inclusive). filters echoes the window actually used and adds date_range_defaulted: true when you did not send both dates. amount is a string with 8 decimals. origin is null for manual operations; on incoming lines only origin.type is kept (reference, sequence and total are null). Data can be up to 5 minutes old.
https://bridge.bifrostcrypto.com/v1/statementsstatements:read(a new key with no list is read-only)"In the ancestral archives of Valhalla, every movement between realms is eternally recorded. The statement scrolls reveal the complete history of your journey through the nine digital worlds."Valkyries, Keepers of the Eternal Records
Headers
| Key | Value | Description |
|---|---|---|
X-Bifrost-Invoke | {{api_key}} | Private API key |
Query Parameters
| Parameter | Example | Description |
|---|---|---|
page | 1 | Page number (default: 1) |
per_page | 50 | Items per page (default: 50, max: 50). Above 50 the request is refused with invalid_pagination; it is not clamped. |
direction | out | Direction: in (incoming) or out (outgoing). Lowercase, case-sensitive. |
type | WITHDRAWAL | Type: DEPOSIT (payin credit), WITHDRAWAL (payout debit), RATE (percentage fee), FEE (network fee), WITHDRAWAL_REFUND (amount of a failed payout returned to your balance), DEPOSIT_REVERSAL (credit removed after the network undid a deposit). Uppercase, case-sensitive. Any other value returns 400 invalid_parameters. |
balance | balance_tether | Filter by balance. Accepts any key returned by Get Balances (the balance_key of each token in GET /v1/summary/tokens, e.g. balance_tether for USDT); exact, case-sensitive match. Anything else is refused with 400 invalid_parameters (details.field = "balance"). |
date_from | 2026-01-01 | Start date (YYYY-MM-DD, inclusive). Omitted, it is 29 days before date_to (a 30-day inclusive window). Read in UTC−03:00. |
date_to | 2026-01-31 | End date (YYYY-MM-DD, inclusive). Omitted, it is today when date_from is also omitted, otherwise date_from + 29 days. Read in UTC−03:00. |
reference_id | order_12345 | Exact reference ID (max 255 characters) |
amount_from | 10.00 | Minimum amount (numeric, >= 0) |
amount_to | 1000.00 | Maximum amount (numeric, >= 0, not lower than amount_from) |
origin_type | recurring_transfer | Filter by the origin of the statement line. recurring_transfer selects lines created by a recurring transfer. |
cURL Example
curl -X GET "https://bridge.bifrostcrypto.com/v1/statements?page=1&per_page=50&direction=out" \
-H "X-Bifrost-Invoke: YOUR_API_KEY"Response Example
{
"message": "statements_retrieved_success",
"statements": [
{
"direction": "out",
"type": "WITHDRAWAL",
"amount": "150.50000000",
"balance": "balance_tether",
"internal_reference": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"origin": {
"type": "recurring_transfer",
"reference": "RT-1a2b3c4d",
"sequence": 3,
"total": 12
},
"created_at": "2026-01-20 14:32:10",
"updated_at": "2026-01-20 14:32:10",
"reference_id": "order_12345"
},
{
"direction": "in",
"type": "DEPOSIT",
"amount": "1000.00000000",
"balance": "balance_tether",
"internal_reference": "f531c319-6957-45c6-a154-d4944ca3eee3",
"origin": null,
"created_at": "2026-01-18 09:05:44",
"updated_at": "2026-01-18 09:05:44",
"reference_id": "invoice_998"
}
],
"filters": {
"balance": "balance_tether",
"date_from": "2026-01-01",
"date_to": "2026-01-31"
},
"meta": {
"current_page": 1,
"per_page": 50,
"total": 2,
"total_pages": 1
}
}Errors
Every error has the shape error.code, error.message and, when useful, error.details. Authentication, scope and rate-limit errors (401, 403, 429) apply to every endpoint and are described under Authentication.
| Status | Code | When | What to do |
|---|---|---|---|
| 400 | invalid_pagination | page below 1 or per_page above 50. | Fix the request before sending it again. |
| 400 | invalid_parameters | direction, type, balance or origin_type is not an accepted value; details.field names it. | Fix the request before sending it again. |
| 400 | invalid_format | A date is not YYYY-MM-DD; details.field names it. | Fix the request before sending it again. |
| 400 | invalid_date_range | date_from is after date_to. | Fix the request before sending it again. |
| 400 | date_range_too_wide | The window is longer than details.max_days (90). | Query the period in smaller windows. |
| 400 | invalid_amount | amount_from or amount_to is not a number ≥ 0, or amount_from is above amount_to. | Fix the request before sending it again. |
| 400 | invalid_reference_id | reference_id is longer than 255 characters. | Fix the request before sending it again. |
| 500 | database_error | The query failed. | Nothing was changed. Retry later. |
Other responses
Responses that are not the happy path and still need handling in your integration.
Date range too wide
Ask for a window longer than max_days and the request is refused rather than served slowly. Page through the period in chunks.
{
"error": {
"code": "date_range_too_wide",
"message": "The requested date range exceeds the maximum allowed",
"details": {
"max_days": 90
}
}
}Invalid filter
Other 400 codes: invalid_pagination (page below 1 or per_page above 50), invalid_parameters (direction, type, balance or origin_type outside the accepted values; details.field names it), invalid_format (date not in YYYY-MM-DD; details.field), invalid_date_range (date_from after date_to), invalid_amount (amount_from/amount_to not numeric or negative, details.field; or amount_from above amount_to, details.reason = invalid_range), invalid_reference_id (reference_id longer than 255). A database failure answers 500 database_error.
{
"error": {
"code": "invalid_parameters",
"message": "Invalid parameters provided",
"details": {
"field": "balance"
}
}
}