Retrieve recurring transactions (inflows and outflows) for a user
curl --request GET \
--url https://prod.truv.com/v1/users/{user_id}/transactions/recurring/ \
--header 'X-Access-Client-Id: <api-key>' \
--header 'X-Access-Secret: <api-key>'import requests
url = "https://prod.truv.com/v1/users/{user_id}/transactions/recurring/"
headers = {
"X-Access-Client-Id": "<api-key>",
"X-Access-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Access-Client-Id': '<api-key>', 'X-Access-Secret': '<api-key>'}
};
fetch('https://prod.truv.com/v1/users/{user_id}/transactions/recurring/', 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://prod.truv.com/v1/users/{user_id}/transactions/recurring/",
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-Access-Client-Id: <api-key>",
"X-Access-Secret: <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://prod.truv.com/v1/users/{user_id}/transactions/recurring/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Client-Id", "<api-key>")
req.Header.Add("X-Access-Secret", "<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://prod.truv.com/v1/users/{user_id}/transactions/recurring/")
.header("X-Access-Client-Id", "<api-key>")
.header("X-Access-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.truv.com/v1/users/{user_id}/transactions/recurring/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Client-Id"] = '<api-key>'
request["X-Access-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"recurring_transactions": {
"outflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Netflix",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"categories": [
"Entertainment",
"Subscriptions"
],
"description": "NETFLIX.COM",
"merchant_category_code": "5968",
"frequency": "M",
"status": "active",
"average_amount": "15.99",
"median_amount": "15.99",
"last_amount": "15.99",
"first_detected": "2024-01-15",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-12-15",
"logo_url": "https://example.com/logos/company.png",
"historical_transactions": [
{
"transaction_id": "24d7e80942ce4ad58a93f70ce4115f5c",
"date": "2025-05-04",
"amount": "200.31",
"description": "NETFLIX.COM"
}
]
}
],
"inflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Acme Corp",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"description": "Salary",
"frequency": "BW",
"average_amount": "3500.00",
"median_amount": "3500.00",
"last_amount": "3500.00",
"status": "active",
"first_detected": "2024-01-01",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-11-29",
"logo_url": "https://example.com/logos/company.png",
"historical_transactions": [
{
"transaction_id": "24d7e80942ce4ad58a93f70ce4115f5c",
"date": "2025-05-04",
"amount": "200.31",
"description": "NETFLIX.COM"
}
],
"income_type": "PAYCHECK"
}
]
}
}{
"error": {
"code": "authentication_failed",
"message": "No such token"
}
}{
"error": {
"code": "not_authenticated",
"message": "Authentication credentials were not provided."
}
}{
"detail": "Not Found."
}Recurring Transactions
Retrieve recurring transactions (inflows and outflows) for a user
Returns recurring transaction patterns detected across the user’s linked bank accounts, split into recurring outflows (subscriptions, bills, and other recurring expenses) and recurring inflows (salary, benefits, and other recurring income sources).
GET
/
v1
/
users
/
{user_id}
/
transactions
/
recurring
/
Retrieve recurring transactions (inflows and outflows) for a user
curl --request GET \
--url https://prod.truv.com/v1/users/{user_id}/transactions/recurring/ \
--header 'X-Access-Client-Id: <api-key>' \
--header 'X-Access-Secret: <api-key>'import requests
url = "https://prod.truv.com/v1/users/{user_id}/transactions/recurring/"
headers = {
"X-Access-Client-Id": "<api-key>",
"X-Access-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Access-Client-Id': '<api-key>', 'X-Access-Secret': '<api-key>'}
};
fetch('https://prod.truv.com/v1/users/{user_id}/transactions/recurring/', 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://prod.truv.com/v1/users/{user_id}/transactions/recurring/",
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-Access-Client-Id: <api-key>",
"X-Access-Secret: <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://prod.truv.com/v1/users/{user_id}/transactions/recurring/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Client-Id", "<api-key>")
req.Header.Add("X-Access-Secret", "<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://prod.truv.com/v1/users/{user_id}/transactions/recurring/")
.header("X-Access-Client-Id", "<api-key>")
.header("X-Access-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.truv.com/v1/users/{user_id}/transactions/recurring/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Client-Id"] = '<api-key>'
request["X-Access-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"recurring_transactions": {
"outflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Netflix",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"categories": [
"Entertainment",
"Subscriptions"
],
"description": "NETFLIX.COM",
"merchant_category_code": "5968",
"frequency": "M",
"status": "active",
"average_amount": "15.99",
"median_amount": "15.99",
"last_amount": "15.99",
"first_detected": "2024-01-15",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-12-15",
"logo_url": "https://example.com/logos/company.png",
"historical_transactions": [
{
"transaction_id": "24d7e80942ce4ad58a93f70ce4115f5c",
"date": "2025-05-04",
"amount": "200.31",
"description": "NETFLIX.COM"
}
]
}
],
"inflows": [
{
"source_id": "68a7e80942ce4ad58a93f70ce411549a",
"source_name": "Acme Corp",
"account_id": "68a7e80942ce4ad58a93f70ce411549a",
"description": "Salary",
"frequency": "BW",
"average_amount": "3500.00",
"median_amount": "3500.00",
"last_amount": "3500.00",
"status": "active",
"first_detected": "2024-01-01",
"last_transaction_date": "2024-11-15",
"next_expected_date": "2024-11-29",
"logo_url": "https://example.com/logos/company.png",
"historical_transactions": [
{
"transaction_id": "24d7e80942ce4ad58a93f70ce4115f5c",
"date": "2025-05-04",
"amount": "200.31",
"description": "NETFLIX.COM"
}
],
"income_type": "PAYCHECK"
}
]
}
}{
"error": {
"code": "authentication_failed",
"message": "No such token"
}
}{
"error": {
"code": "not_authenticated",
"message": "Authentication credentials were not provided."
}
}{
"detail": "Not Found."
}Authorizations
Query Parameters
Was this page helpful?