Introduction
Read-only access to your Tirelio data, such as your bank transactions.
The Tirelio API gives you access to your own Tirelio data. Every request reads exclusively from your own database.
Rate limit
Each account may make 100 requests per day (a rolling 24-hour window starting with the first request).
Every response includes the headers X-RateLimit-Limit and X-RateLimit-Remaining.
Once the limit is reached, the API responds with 429 Too Many Requests and a Retry-After header (in seconds).
Errors
| Status | Meaning |
|---|---|
| 401 | The token is missing or invalid |
| 403 | No active subscription |
| 422 | Invalid parameters, see errors for details |
| 429 | Daily limit reached |
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer {DEIN_API_TOKEN}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
Create your token in the Tirelio customer area under API. It is shown only once; creating a new token immediately invalidates the previous one.
Transactions
Transactions of your bank accounts.
List transactions
requires authentication
Returns your transactions, newest first (by booking date). The list is paginated; follow links.next to get the next page. All filters can be combined.
Example request:
curl --request GET \
--get "https://tirelio.app/api/v1/transactions?limit=50&page=1&search=rewe&bank_account_id=01JB8Y7D2C5H8P1RZ3N6K9V4QS&from=2026-10-01&until=2026-10-31&direction=expense&category_id=12&without_logo=" \
--header "Authorization: Bearer {DEIN_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://tirelio.app/api/v1/transactions"
);
const params = {
"limit": "50",
"page": "1",
"search": "rewe",
"bank_account_id": "01JB8Y7D2C5H8P1RZ3N6K9V4QS",
"from": "2026-10-01",
"until": "2026-10-31",
"direction": "expense",
"category_id": "12",
"without_logo": "0",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {DEIN_API_TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://tirelio.app/api/v1/transactions';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {DEIN_API_TOKEN}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'limit' => '50',
'page' => '1',
'search' => 'rewe',
'bank_account_id' => '01JB8Y7D2C5H8P1RZ3N6K9V4QS',
'from' => '2026-10-01',
'until' => '2026-10-31',
'direction' => 'expense',
'category_id' => '12',
'without_logo' => '0',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://tirelio.app/api/v1/transactions'
params = {
'limit': '50',
'page': '1',
'search': 'rewe',
'bank_account_id': '01JB8Y7D2C5H8P1RZ3N6K9V4QS',
'from': '2026-10-01',
'until': '2026-10-31',
'direction': 'expense',
'category_id': '12',
'without_logo': '0',
}
headers = {
'Authorization': 'Bearer {DEIN_API_TOKEN}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200, A page of transactions):
{
"data": [
{
"id": "01JB8Z3K6Q2W9V0XG7M4TQ5R1N",
"bank_account_id": "01JB8Y7D2C5H8P1RZ3N6K9V4QS",
"status": "booked",
"booking_date": "2026-10-20",
"value_date": "2026-10-20",
"amount": "-23.49",
"currency": "EUR",
"name": "REWE Markt GmbH",
"merchant": "REWE",
"creditor": {
"name": "REWE Markt GmbH",
"iban": "DE89370400440532013000"
},
"debtor": {
"name": "Jane Doe",
"iban": "DE02120300000000202051"
},
"remittance_information": "REWE SAGT DANKE 12345",
"booking_text": "Direct debit",
"mandate_id": null,
"creditor_id": null,
"category": {
"id": 12,
"name": "Lebensmittel",
"assigned_by": "rule"
}
},
{
"id": "01JB8Z2F1M7T4X0VJ6C9B3R8KD",
"bank_account_id": "01JB8Y7D2C5H8P1RZ3N6K9V4QS",
"status": "booked",
"booking_date": "2026-10-15",
"value_date": "2026-10-15",
"amount": "3250.00",
"currency": "EUR",
"name": "Example Corp",
"merchant": null,
"creditor": {
"name": "Jane Doe",
"iban": "DE02120300000000202051"
},
"debtor": {
"name": "Example Corp",
"iban": "DE12500105170648489890"
},
"remittance_information": "Salary October 2026",
"booking_text": "Credit transfer",
"mandate_id": null,
"creditor_id": null,
"category": null
}
],
"links": {
"first": "https://tirelio.example/api/v1/transactions?limit=2&page=1",
"last": "https://tirelio.example/api/v1/transactions?limit=2&page=21",
"prev": null,
"next": "https://tirelio.example/api/v1/transactions?limit=2&page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 21,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "https://tirelio.example/api/v1/transactions?limit=2&page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": "https://tirelio.example/api/v1/transactions?limit=2&page=2",
"label": "2",
"page": 2,
"active": false
},
{
"url": "https://tirelio.example/api/v1/transactions?limit=2&page=2",
"label": "Next »",
"page": 2,
"active": false
}
],
"path": "https://tirelio.example/api/v1/transactions",
"per_page": 2,
"to": 2,
"total": 42
}
}
Example response (401, The token is missing or invalid):
{
"message": "Unauthenticated."
}
Example response (403, No active subscription):
{
"message": "No active subscription."
}
Example response (422, Invalid parameters):
{
"message": "The limit field must not be greater than 500.",
"errors": {
"limit": [
"The limit field must not be greater than 500."
]
}
}
Example response (429, Daily limit reached):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
data
object[]
Transactions of this page.
id
string
Transaction ID (ULID).
bank_account_id
string
ID of the bank account the transaction belongs to.
status
string
booked for booked, pending for pending transactions.
bookedpending
booking_date
string
Booking date, YYYY-MM-DD.
value_date
string
Value date, YYYY-MM-DD.
amount
string
Amount as a decimal string; negative for expenses, positive for income.
currency
string
ISO 4217 currency code, e.g. EUR.
name
string
Counterparty: the creditor for expenses, the debtor for income, the merchant for card payments.
merchant
string
Merchant recognised by Tirelio, otherwise null.
creditor
object
Creditor (payee) with name and iban.
debtor
object
Debtor (payer) with name and iban.
remittance_information
string
Remittance information (payment reference).
booking_text
string
Booking text provided by the bank, e.g. Direct debit.
mandate_id
string
SEPA mandate reference for direct debits.
creditor_id
string
SEPA creditor identifier for direct debits.
category
object
Category with id, name and assigned_by (rule, manual or fallback); null while no category is assigned.
links
object
URLs of the first, last, previous and next page.
prev
string
URL of the previous page, null on the first page.
next
string
URL of the next page, null on the last page.
meta
object
Pagination details: current_page, last_page, per_page, total etc.
current_page, last_page, per_page, total etc.from
integer
Position of the first transaction on this page, null if the page is empty.
links
object[]
Links to the individual pages with url, label, page and active.
url, label, page and active.url
string
URL of the page, null if there is none (e.g. no previous page).
page
integer
Page number, null if there is none; missing for the ... separator.
to
integer
Position of the last transaction on this page, null if the page is empty.