Transactions
The transaction history is one row per business event — a payment, a payout, a refund, a conversion. It is not a double-entry ledger: a single payment moves money through several ledger entries, and listing those would show duplicates and charge a separate line for the system fee. The history is a projection written alongside the money movement, and this endpoint reads only that projection.
This endpoint is listed as accepting either a dashboard session or an API key signature, but the signature has not been confirmed for this route. If a signed request answers 401 UNAUTHORIZED, use a session JWT instead. See Authentication for how to sign a request.
What a row contains
Every row in items has the fields below. The list is offset-paginated: the pagination object carries page, limit, total, and totalPages.
| Field | Type | Description |
|---|---|---|
| id | string (UUID) | Identifier of the history row itself. Searchable. |
| type | string | What the row represents: PAYMENT, PAYOUT, REFUND, or CONVERT. |
| status | string | PENDING, PAID, or FAILED. |
| amount.amount | string | The net amount credited to you for this event, written to the currency’s own precision. A fee is never a row of its own. |
| amount.currency | object | The currency of the row: id, name, type, displayDecimal, blockchain, and iconUrl. |
| businessInvoiceId | string (UUID) | The business invoice this event belongs to. Searchable. |
| createdAt | string (ISO 8601) | When the financial event happened — not when the history row was written. |
Where to find a currencyId
The currency reference is not covered by this version of the documentation. The only value you can observe today is amount.currency.id on a row returned by this endpoint — which does not help if you have no transactions yet. In the response example the amount is written to as many decimals as amount.currency.displayDecimal reports — an observation from that example, not a documented rule.
What gets recorded
A row is written in the same database transaction as the balance change, so the history never lags behind your balance. The same underlying operation always maps to the same row: recording it again updates that row rather than adding a second one.
- A confirmed payment appears once the money has been credited to your balance, including a late payment that support has accepted.
- A partially paid invoice, and a late payment support has not accepted, never reach the history — nothing has been credited for them.
REFUNDandCONVERTrows are not written today. The types exist in the API, but no flow produces them yet.
Search
The search parameter takes 3 to 100 characters and covers two different things. An empty or whitespace-only value is ignored rather than rejected.
- A UUID is matched against
idandbusinessInvoiceId, so an invoice id finds the payments recorded for it. - An amount is matched exactly, never as a prefix or a range:
100finds a row of 100 USDT (6 decimals) and a row of 100 USD (2 decimals), but never one of 1000.
List transactions
/transactionsAuth: JWT or API key signature
Returns your transaction history, newest first. Every row is one business event, and you only ever see your own rows.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| type | string | Optional | Event type: PAYMENT, PAYOUT, REFUND, or CONVERT. Accepts several values. | |
| status | string | Optional | Row status: PENDING, PAID, or FAILED. Accepts several values. | |
| currencyId | string (UUID) | Optional | Currency of the row. Accepts several values. See the note above on where a currency id can be observed. | |
| periodFrom | string (ISO 8601) | Optional | Earliest event time to return. The bound is inclusive. | |
| periodTo | string (ISO 8601) | Optional | Latest event time to return. The bound is inclusive. A periodFrom later than periodTo is rejected. | |
| search | string | Optional | 3–100 characters. A UUID matches id or businessInvoiceId; a number is matched against the amount. An empty or whitespace-only value is ignored. | |
| page | number | Optional | Which page of the history to return. | |
| limit | number | Optional | 20 | Rows per page. The maximum is 100. |
/transactionscurl 'https://dev-app.tedr.com/api/transactions?type=PAYMENT&status=PAID&limit=20' \
-H 'Authorization: Bearer YOUR_SESSION_JWT'
const query = new URLSearchParams({
type: 'PAYMENT',
status: 'PAID',
limit: '20',
});
const response = await fetch(
`https://dev-app.tedr.com/api/transactions?${query}`,
{ headers: { Authorization: 'Bearer YOUR_SESSION_JWT' } },
);
const { items, pagination } = await response.json();
import requests
response = requests.get(
'https://dev-app.tedr.com/api/transactions',
headers={'Authorization': 'Bearer YOUR_SESSION_JWT'},
params={'type': 'PAYMENT', 'status': 'PAID', 'limit': 20},
)
page = response.json()
Response: 200
{
"items": [
{
"id": "18fbfb13-2d45-4e03-98b8-4b8076245a62",
"type": "PAYMENT",
"status": "PAID",
"amount": {
"amount": "100.000000",
"currency": {
"id": "…",
"name": "USDT",
"type": "CRYPTO",
"displayDecimal": 6,
"blockchain": "ETH",
"iconUrl": null
}
},
"businessInvoiceId": "72549e86-ac03-47b7-bcde-b7bec7cc1c01",
"createdAt": "2026-08-13T12:00:00.000Z"
}
],
"pagination": { "page": 1, "limit": 20, "total": 1, "totalPages": 1 }
}
| Code | Status | When |
|---|---|---|
| INVALID_DATE_RANGE | — | periodFrom is later than periodTo. |
| UNAUTHORIZED | 401 | The request carries no valid session or key signature. |
Rows come back sorted by createdAt, newest first, and the list is offset-paginated — read pagination.totalPages to know when to stop. The provider-side transaction hash is not returned in list rows. type, status and currencyId each accept several values; how several values are encoded in the query string is not fixed by this version of the reference.
