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
Client ID
Client Access Key
Path Parameters
Query Parameters
Filter by recurring source status. Defaults to active. Use all to return sources in any state.
Available options:
active, inactive, irregular, all Filter to a specific link ID. Defaults to all of the user's links.
Response
Recurring transactions for a user, split into recurring outflows (expenses) and recurring inflows (income sources).
Show child attributes
Show child attributes
Was this page helpful?
⌘I