Fetch Account Transactions
curl --request GET \
--url https://api.atoa.me/api/bank/accounts/{accountId}/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.atoa.me/api/bank/accounts/{accountId}/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.atoa.me/api/bank/accounts/{accountId}/transactions', 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.atoa.me/api/bank/accounts/{accountId}/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.atoa.me/api/bank/accounts/{accountId}/transactions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.atoa.me/api/bank/accounts/{accountId}/transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atoa.me/api/bank/accounts/{accountId}/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "txn_001",
"date": "2024-01-14T11:45:00Z",
"type": "DEBIT",
"amount": 89.99,
"currency": "GBP",
"description": "Amazon Marketplace",
"reference": "INV-4321-A",
"transactionCategory": "E-commerce",
"status": "BOOKED",
"payee": {
"name": "Amazon UK Ltd",
"accountDetails": {
"sortCode": "123456",
"accountNumber": "87654321"
}
},
"balance": { "amount": 2.37, "currency": "GBP" }
},
{
"id": "txn_002",
"date": "2024-01-12T09:30:00Z",
"type": "CREDIT",
"amount": 1500.0,
"currency": "GBP",
"description": "Salary Payment",
"reference": "SALARY-JAN",
"transactionCategory": "Income",
"status": "BOOKED",
"payer": {
"name": "ABC Company Ltd",
"accountDetails": {
"sortCode": "654321",
"accountNumber": "12345678"
}
},
"balance": { "amount": 1592.36, "currency": "GBP" }
}
],
"meta": { "count": 2 },
"links": {
"prev": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<prev-page-cursor>",
"self": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<current-page-cursor>",
"next": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<next-page-cursor>"
}
}
{
"name": "UNAUTHORIZED",
"message": "Unauthorized",
"status": 401,
"errors": []
}
{
"name": "NOT FOUND",
"message": "Consent not found",
"status": 404,
"errors": []
}
{
"name": "GONE",
"message": "The pagination cursor is expired or invalid. Restart pagination without a cursor.",
"status": 410,
"errors": []
}
Bank Feed
Fetch Account Transactions
Retrieve account transactions via the Atoa Bank Feed API, request parameters, response schema and code samples in cURL, Python, JavaScript, PHP, Go and Java.
GET
/
api
/
bank
/
accounts
/
{accountId}
/
transactions
Fetch Account Transactions
curl --request GET \
--url https://api.atoa.me/api/bank/accounts/{accountId}/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.atoa.me/api/bank/accounts/{accountId}/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.atoa.me/api/bank/accounts/{accountId}/transactions', 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.atoa.me/api/bank/accounts/{accountId}/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.atoa.me/api/bank/accounts/{accountId}/transactions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.atoa.me/api/bank/accounts/{accountId}/transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atoa.me/api/bank/accounts/{accountId}/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "txn_001",
"date": "2024-01-14T11:45:00Z",
"type": "DEBIT",
"amount": 89.99,
"currency": "GBP",
"description": "Amazon Marketplace",
"reference": "INV-4321-A",
"transactionCategory": "E-commerce",
"status": "BOOKED",
"payee": {
"name": "Amazon UK Ltd",
"accountDetails": {
"sortCode": "123456",
"accountNumber": "87654321"
}
},
"balance": { "amount": 2.37, "currency": "GBP" }
},
{
"id": "txn_002",
"date": "2024-01-12T09:30:00Z",
"type": "CREDIT",
"amount": 1500.0,
"currency": "GBP",
"description": "Salary Payment",
"reference": "SALARY-JAN",
"transactionCategory": "Income",
"status": "BOOKED",
"payer": {
"name": "ABC Company Ltd",
"accountDetails": {
"sortCode": "654321",
"accountNumber": "12345678"
}
},
"balance": { "amount": 1592.36, "currency": "GBP" }
}
],
"meta": { "count": 2 },
"links": {
"prev": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<prev-page-cursor>",
"self": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<current-page-cursor>",
"next": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<next-page-cursor>"
}
}
{
"name": "UNAUTHORIZED",
"message": "Unauthorized",
"status": 401,
"errors": []
}
{
"name": "NOT FOUND",
"message": "Consent not found",
"status": 404,
"errors": []
}
{
"name": "GONE",
"message": "The pagination cursor is expired or invalid. Restart pagination without a cursor.",
"status": 410,
"errors": []
}
Once bank account access is authorized, use the following API to fetch transaction data.
Response
Pass the cursor back unchanged. An expired or tampered cursor returns
This endpoint uses cursor-based pagination, returning one bank page per call. Follow
links.next exactly as returned until it is no longer present to page through all transactions. Responses use the { data, meta, links } envelope shown in the sample response below.Authorization
Bearer<token>
Request Body Schema
string
required
ID of the user’s bank account. This can be obtained from the redirect URL
after account linking or by using the Fetch All Accounts API
Reference
endpoint.Refer:- Accounts
string
Inclusive lower bound on the booking date. Accepts either a plain
date (e.g.
2025-08-17) or a full ISO 8601 date-time (e.g.
2026-01-01T00:00:00Z). Only applies to the first call. Once
pagination has started, the date range is held inside the cursor,
so from should not be sent again alongside a cursor.string
Exclusive upper bound on the booking date. Accepts either a plain
date (e.g.
2025-08-17) or a full ISO 8601 date-time.
Only applies to the first call. Should not be sent again
alongside a cursor. before requires from to also be set.string
Cursor token taken from a previous response’s
links.next or links.prev.
Pass it back unchanged — do not read, decode, or modify it. A stale,
tampered, or reused cursor returns 410 Gone, signalling that the caller
should restart pagination without a cursor.array
Array of transactions. Each transaction has the following fields:
Show child attributes
Show child attributes
string
A unique identifier for the transaction. Use this to deduplicate or
track individual transactions.
string
The most recent date associated with the transaction. This may be the
booking date or value date depending on the bank.
string
Indicates whether the transaction is a CREDIT (money received) or
DEBIT (money sent).
number
The monetary value of the transaction. This can be positive or
negative based on the type.
string
The currency code (e.g., GBP, EUR) in which the transaction was made.
string
Any additional information or context provided by the bank. This could
include metadata, internal codes, or bank-provided notes.
string
The name of the merchant involved in the transaction, if provided by
the bank.
string
A high-level category indicating the nature of the transaction (e.g.,
Payments, Transfers, ATM, etc.). Helps in transaction classification.
string
The current state of the transaction. Can be BOOKED (processed and
settled) or PENDING (initiated but not yet fully processed).
object
The payer object provides information about the sender of the funds.
object
The payee object provides information about the recipient of the funds.
object
Cursor-based pagination
Atoa’sGet Account Transactions endpoint uses cursor-based pagination. It accepts from and before as optional query parameters when sending the initial request, and accepts cursor as an optional query parameter in subsequent requests.
How it works
Atoa doesn’t set alimit for the maximum number of transactions returned per page, but an individual bank can set a limit.
The meta object in the response includes count that represents the number of transactions in that page, but doesn’t return a field for the total number of transactions.
The data object in the response contains an array of transactions.
The links object in the response returns cursor tokens that can be fed into the subsequent request:
prev- a cursor or link to the previous pageself- a cursor or link to the current pagenext- a cursor or link to the next page
Examples
- First page
- Middle page
- Final page
GET /accounts/{accountId}/transactions returns self and next."links": {
"self": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<current-page-cursor>",
"next": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<next-page-cursor>"
}
GET /accounts/{accountId}/transactions?cursor=<current-page-cursor> returns prev, self and next."links": {
"prev": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<prev-page-cursor>",
"self": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<current-page-cursor>",
"next": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<next-page-cursor>"
}
GET /accounts/{accountId}/transactions?cursor=<current-page-cursor> returns prev and self."links": {
"prev": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<prev-page-cursor>",
"self": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<current-page-cursor>"
}
410 Gone, at which point restart pagination without a cursor. Because the date range is held inside the cursor, later calls should not re-send from or before alongside it.
{
"data": [
{
"id": "txn_001",
"date": "2024-01-14T11:45:00Z",
"type": "DEBIT",
"amount": 89.99,
"currency": "GBP",
"description": "Amazon Marketplace",
"reference": "INV-4321-A",
"transactionCategory": "E-commerce",
"status": "BOOKED",
"payee": {
"name": "Amazon UK Ltd",
"accountDetails": {
"sortCode": "123456",
"accountNumber": "87654321"
}
},
"balance": { "amount": 2.37, "currency": "GBP" }
},
{
"id": "txn_002",
"date": "2024-01-12T09:30:00Z",
"type": "CREDIT",
"amount": 1500.0,
"currency": "GBP",
"description": "Salary Payment",
"reference": "SALARY-JAN",
"transactionCategory": "Income",
"status": "BOOKED",
"payer": {
"name": "ABC Company Ltd",
"accountDetails": {
"sortCode": "654321",
"accountNumber": "12345678"
}
},
"balance": { "amount": 1592.36, "currency": "GBP" }
}
],
"meta": { "count": 2 },
"links": {
"prev": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<prev-page-cursor>",
"self": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<current-page-cursor>",
"next": "https://api.atoa.me/api/bank/accounts/{accountId}/transactions?cursor=<next-page-cursor>"
}
}
{
"name": "UNAUTHORIZED",
"message": "Unauthorized",
"status": 401,
"errors": []
}
{
"name": "NOT FOUND",
"message": "Consent not found",
"status": 404,
"errors": []
}
{
"name": "GONE",
"message": "The pagination cursor is expired or invalid. Restart pagination without a cursor.",
"status": 410,
"errors": []
}