MENU navbar-image

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."
}
 

Request      

GET api/v1/transactions

Headers

Authorization        

Example: Bearer {DEIN_API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

limit   integer  optional    

Transactions per page, defaults to 50. Must be at least 1. Must not be greater than 500. Example: 50

page   integer  optional    

Page number. Must be at least 1. Must not be greater than 100000. Example: 1

search   string  optional    

Case-insensitive search in creditor name, debtor name and remittance information. Must match the regex /^[^\x00]*$/u. Must be at least 1 character. Must not be greater than 100 characters. Example: rewe

bank_account_id   string  optional    

Only transactions of this bank account (bank_account_id of a transaction). Example: 01JB8Y7D2C5H8P1RZ3N6K9V4QS

from   string  optional    

Booked on or after this date, YYYY-MM-DD. Must be a valid date in the format Y-m-d. Example: 2026-10-01

until   string  optional    

Booked on or before this date, YYYY-MM-DD. Must be a valid date in the format Y-m-d. Example: 2026-10-31

direction   string  optional    

income for incoming, expense for outgoing transactions only. Example: expense

Must be one of:
  • income
  • expense
category_id   integer  optional    

Only transactions of this category and its subcategories. An unknown category yields an empty list. Must be at least 1. Must not be greater than 9223372036854775807. Example: 12

without_logo   boolean  optional    

Only transactions for which Tirelio knows no merchant logo. Example: false

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.

Must be one of:
  • booked
  • pending
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.

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   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.