Get end user transactions
curl --request GET \
--url https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions \
--header 'x-api-key: <api-key>'import requests
url = "https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/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://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/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 => [
"x-api-key: <api-key>"
],
]);
$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://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"_meta": {
"next_url": "<string>",
"num_results": 123,
"page": 123,
"per_page": 123,
"prev_url": "<string>"
},
"transactions_enriched": [
{
"amount": -42.42,
"description": "GOOGLE *ADS12340929 [email protected] US",
"account_id": "checking_account_202348",
"account_number": "1234567890",
"annotation": {
"annotator": {
"context": "sync",
"priority_type": "gold_standard"
},
"category": {
"label": "Rent",
"heron_id": "ctg_nQKwdgnA5JXdvg3UxhDmXN"
},
"confidence": 123,
"model_version": "<string>"
},
"balance": 423,
"counterparty": "GOOGLE",
"currency": "USD",
"data_source_account_heron_id": "dsa_SPZ7V8fY9UAMPrYrB3pxh7",
"data_source_heron_id": "dso_ZPAnmGe5imiroW6eM8NbF9",
"end_user_id": "my_best_customer_203948",
"features": {
"description_clean": "GOOGLE ADS",
"duplicate_of_id": "txn_XE8xWqXrW8NPe8qiYE8CF6",
"has_matching_transaction": true,
"is_potential_duplicate": true,
"is_recurring": true
},
"heron_id": "txn_BwVsnvJu4gb3LutJPitKon",
"last_updated": "2026-08-17T22:42:11.953546+00:00",
"merchant": {
"name": "<string>",
"url": "<string>",
"categories": [
{
"code": "7311",
"description": "Advertising services",
"slug": "advertising_services"
}
],
"group_id": "Uber",
"heron_id": "mrc_mAQPKUrCYks47ziGa5hw8Q",
"icon_url": "<string>",
"is_priority": true,
"logo_url": "<string>"
},
"reference_id": "my_favourite_transaction_231098",
"request_id": "req_LWxRN3sfiGxU5sn7QDzULh",
"timestamp": "2021-11-12T10:38:05Z",
"transaction_code": "card"
}
]
}EnrichedTransactions
Get end user transactions
Get all unique transactions for a single end user. Set end user status to “ready” to initiate transaction enrichment, otherwise may contain both enriched and unenriched transactions
GET
/
api
/
end_users
/
{end_user_id_or_heron_id}
/
transactions
Get end user transactions
curl --request GET \
--url https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions \
--header 'x-api-key: <api-key>'import requests
url = "https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/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://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/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 => [
"x-api-key: <api-key>"
],
]);
$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://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.herondata.io/api/end_users/{end_user_id_or_heron_id}/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"_meta": {
"next_url": "<string>",
"num_results": 123,
"page": 123,
"per_page": 123,
"prev_url": "<string>"
},
"transactions_enriched": [
{
"amount": -42.42,
"description": "GOOGLE *ADS12340929 [email protected] US",
"account_id": "checking_account_202348",
"account_number": "1234567890",
"annotation": {
"annotator": {
"context": "sync",
"priority_type": "gold_standard"
},
"category": {
"label": "Rent",
"heron_id": "ctg_nQKwdgnA5JXdvg3UxhDmXN"
},
"confidence": 123,
"model_version": "<string>"
},
"balance": 423,
"counterparty": "GOOGLE",
"currency": "USD",
"data_source_account_heron_id": "dsa_SPZ7V8fY9UAMPrYrB3pxh7",
"data_source_heron_id": "dso_ZPAnmGe5imiroW6eM8NbF9",
"end_user_id": "my_best_customer_203948",
"features": {
"description_clean": "GOOGLE ADS",
"duplicate_of_id": "txn_XE8xWqXrW8NPe8qiYE8CF6",
"has_matching_transaction": true,
"is_potential_duplicate": true,
"is_recurring": true
},
"heron_id": "txn_BwVsnvJu4gb3LutJPitKon",
"last_updated": "2026-08-17T22:42:11.953546+00:00",
"merchant": {
"name": "<string>",
"url": "<string>",
"categories": [
{
"code": "7311",
"description": "Advertising services",
"slug": "advertising_services"
}
],
"group_id": "Uber",
"heron_id": "mrc_mAQPKUrCYks47ziGa5hw8Q",
"icon_url": "<string>",
"is_priority": true,
"logo_url": "<string>"
},
"reference_id": "my_favourite_transaction_231098",
"request_id": "req_LWxRN3sfiGxU5sn7QDzULh",
"timestamp": "2021-11-12T10:38:05Z",
"transaction_code": "card"
}
]
}Authorizations
Path Parameters
Query Parameters
Filter for transactions whose values were last updated in Heron systems after the specified input value, isoformat
Example:
"2026-08-17T22:42:06.305099"
Results page
Required range:
x >= 1Desired results per page
Required range:
1 <= x <= 50000Account ids to include. If not provided, all accounts are included
Filter by the heron_id of the category that the transaction is annotated with
Example:
"ctg_45jtExbcL86BNywfuKjxYM"
What to order transactions by
Available options:
amount_asc, amount_desc, abs_amount_asc, abs_amount_desc, description_asc, description_desc, timestamp_asc, timestamp_desc, id_asc, id_desc, confidence_asc, confidence_desc, created_asc, created_desc Was this page helpful?
⌘I