curl --request GET \
--url https://prod.truv.com/v1/links/{link_id}/benefit_letters/{benefit_letter_id}/ \
--header 'X-Access-Client-Id: <api-key>' \
--header 'X-Access-Secret: <api-key>'import requests
url = "https://prod.truv.com/v1/links/{link_id}/benefit_letters/{benefit_letter_id}/"
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/links/{link_id}/benefit_letters/{benefit_letter_id}/', 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/links/{link_id}/benefit_letters/{benefit_letter_id}/",
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/links/{link_id}/benefit_letters/{benefit_letter_id}/"
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/links/{link_id}/benefit_letters/{benefit_letter_id}/")
.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/links/{link_id}/benefit_letters/{benefit_letter_id}/")
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{
"id": "24d7e80942ce4ad58a93f70ce4115f5c",
"document_type": "VA_BENEFIT_LETTER",
"file": "https://cdn.truv.com/paystub_sample.pdf",
"md5sum": "24d7e80942ce4ad58a93f70ce4115f5c",
"created_at": "2026-09-02T10:15:30.123456Z",
"updated_at": "2026-09-02T10:15:30.123456Z",
"fields": {
"combined_evaluation": 70,
"effective_date": "2025-12-01",
"gross_benefit_amount": "1986.45",
"net_amount_paid": "1986.45"
}
}{
"error": {
"code": "authentication_failed",
"message": "No such token"
}
}{
"error": {
"code": "not_authenticated",
"message": "Authentication credentials were not provided."
}
}{
"detail": "Not Found."
}Retrieve benefit letter
The endpoint returns a benefit letter with the values read from it in fields. document_type says which shape fields has; for VA_BENEFIT_LETTER, the only type returned today, it carries the combined evaluation, the effective date of the award, and the gross and net monthly benefit amounts.
Every field is read from the letter and is never derived. The VA combines rated conditions with its own table and rounds to the nearest ten (38 CFR 4.25), so individual ratings do not add up to combined_evaluation, and the letter prints only the combined figure.
A field is null when the letter did not state that line. 0 and "0.00" are real values and are returned as such, so an absent line is always distinguishable from a zero one.
The rating and the amounts are independent: a benefit can be waived, offset against military retired pay, apportioned or withheld, so a veteran at 100 percent can be paid 0.00. The letter prints no deduction lines, so a difference between gross_benefit_amount and net_amount_paid is reported but never explained.
Both amounts are monthly and in US dollars. The letter states neither — VA disability compensation is paid monthly in US dollars for every letter — so the response carries no currency and no cadence field.
curl --request GET \
--url https://prod.truv.com/v1/links/{link_id}/benefit_letters/{benefit_letter_id}/ \
--header 'X-Access-Client-Id: <api-key>' \
--header 'X-Access-Secret: <api-key>'import requests
url = "https://prod.truv.com/v1/links/{link_id}/benefit_letters/{benefit_letter_id}/"
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/links/{link_id}/benefit_letters/{benefit_letter_id}/', 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/links/{link_id}/benefit_letters/{benefit_letter_id}/",
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/links/{link_id}/benefit_letters/{benefit_letter_id}/"
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/links/{link_id}/benefit_letters/{benefit_letter_id}/")
.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/links/{link_id}/benefit_letters/{benefit_letter_id}/")
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{
"id": "24d7e80942ce4ad58a93f70ce4115f5c",
"document_type": "VA_BENEFIT_LETTER",
"file": "https://cdn.truv.com/paystub_sample.pdf",
"md5sum": "24d7e80942ce4ad58a93f70ce4115f5c",
"created_at": "2026-09-02T10:15:30.123456Z",
"updated_at": "2026-09-02T10:15:30.123456Z",
"fields": {
"combined_evaluation": 70,
"effective_date": "2025-12-01",
"gross_benefit_amount": "1986.45",
"net_amount_paid": "1986.45"
}
}{
"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
Response
A benefit letter of a link. document_type says which letter it is and which shape its fields take on retrieve.
Benefit letter ID
"24d7e80942ce4ad58a93f70ce4115f5c"
Benefit letter type. It decides the shape of fields on retrieve. VA_BENEFIT_LETTER is the VA Benefit Verification letter, whose fields are described by VaBenefitLetterFields. SSA_BENEFIT_LETTER is reserved for the Social Security benefit letter; none are returned yet, and its fields will be documented when they are.
VA_BENEFIT_LETTER, SSA_BENEFIT_LETTER "VA_BENEFIT_LETTER"
Link to the file the letter was read from
"https://cdn.truv.com/paystub_sample.pdf"
MD5 checksum of the file
"24d7e80942ce4ad58a93f70ce4115f5c"
Time the letter was first read
"2026-09-02T10:15:30.123456Z"
Time the values read from the letter last changed
"2026-09-02T10:15:30.123456Z"
Disability benefit details read from the veteran's VA Benefit Verification letter. Each field carries one line of the letter; a line the letter did not state is null.
Show child attributes
Show child attributes
Was this page helpful?