curl --request GET \
--url https://api.mytruv.com/v2/users/recurring-transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mytruv.com/v2/users/recurring-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{
"recurring_transactions": {
"outflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Netflix",
"categories": [
"Entertainment",
"Subscriptions"
],
"description": "NETFLIX.COM",
"first_detected": "2024-01-15",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"merchant_category_code": "5968",
"frequency": "MONTHLY",
"status": "active",
"average_amount": "15.99",
"median_amount": "15.99",
"last_amount": "15.99",
"logo_url": "https://example.com/logo.png",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-12-15",
"historical_transactions": [
{
"transaction_id": "<string>",
"description": "NETFLIX.COM",
"date": "2025-05-04",
"amount": "200.31"
}
]
}
],
"inflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Acme Corp",
"description": "Salary",
"first_detected": "2024-01-01",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-11-29",
"income_type": "salary",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"frequency": "BIWEEKLY",
"average_amount": "3500.00",
"median_amount": "3500.00",
"last_amount": "3500.00",
"logo_url": "https://example.com/logo.png",
"status": "active",
"historical_transactions": [
{
"transaction_id": "<string>",
"description": "NETFLIX.COM",
"date": "2025-05-04",
"amount": "200.31"
}
]
}
]
},
"accounts": [
{
"type": "CHECKING",
"balances": {
"currency_code": "USD",
"balance": "100.00",
"available_balance": "50.99",
"credit_limit": "200.00"
},
"id": "24d7e80942ce4ad58a93f70ce4115f5c",
"created_at": "2022-05-04T11:30:00Z",
"updated_at": "2022-05-04T12:00:00Z",
"subtype": "MONEY_MARKET",
"mask": "6789",
"nickname": "My account"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Recurring Transactions
Get recurring transactions (v2, ClickHouse-backed outflows + Core API inflows).
Reads outflows from local ClickHouse detection results. Proxies inflows from Core API (income detection is a separate pipeline).
The response includes an accounts list covering every account
referenced by an inflow or outflow, so clients can display the source
account (name, mask) on each row without an extra lookup. Match each
item’s account_id against accounts[].id.
Returns empty lists if no recurring detection data exists yet.
curl --request GET \
--url https://api.mytruv.com/v2/users/recurring-transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-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.mytruv.com/v2/users/recurring-transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mytruv.com/v2/users/recurring-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{
"recurring_transactions": {
"outflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Netflix",
"categories": [
"Entertainment",
"Subscriptions"
],
"description": "NETFLIX.COM",
"first_detected": "2024-01-15",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"merchant_category_code": "5968",
"frequency": "MONTHLY",
"status": "active",
"average_amount": "15.99",
"median_amount": "15.99",
"last_amount": "15.99",
"logo_url": "https://example.com/logo.png",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-12-15",
"historical_transactions": [
{
"transaction_id": "<string>",
"description": "NETFLIX.COM",
"date": "2025-05-04",
"amount": "200.31"
}
]
}
],
"inflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Acme Corp",
"description": "Salary",
"first_detected": "2024-01-01",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-11-29",
"income_type": "salary",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"frequency": "BIWEEKLY",
"average_amount": "3500.00",
"median_amount": "3500.00",
"last_amount": "3500.00",
"logo_url": "https://example.com/logo.png",
"status": "active",
"historical_transactions": [
{
"transaction_id": "<string>",
"description": "NETFLIX.COM",
"date": "2025-05-04",
"amount": "200.31"
}
]
}
]
},
"accounts": [
{
"type": "CHECKING",
"balances": {
"currency_code": "USD",
"balance": "100.00",
"available_balance": "50.99",
"credit_limit": "200.00"
},
"id": "24d7e80942ce4ad58a93f70ce4115f5c",
"created_at": "2022-05-04T11:30:00Z",
"updated_at": "2022-05-04T12:00:00Z",
"subtype": "MONEY_MARKET",
"mask": "6789",
"nickname": "My account"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer authentication with a personal access token (prefix pat_). Generate tokens in the Truv web app under Settings → API keys.
Query Parameters
Filter by recurring status: active, inactive, irregular, or all. Defaults to active.
active, inactive, irregular, all Response
Recurring transactions (v2, ClickHouse-backed outflows) enriched with source accounts.
Recurring transactions enriched with source accounts; match each item's account_id against accounts[].id.
Recurring inflows (income) and outflows (expenses) from the Truv API.
Show child attributes
Show child attributes
Accounts referenced by the recurring items. Only accounts that appear on an inflow or outflow are included.
Show child attributes
Show child attributes
Was this page helpful?