curl --request GET \
--url https://prod.truv.com/v1/links/{link_id}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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{
"document_type": "VOLUNTEER_LETTER",
"id": "24d7e80942ce4ad58a93f70ce4115f5c",
"document_subtype": "VOL_TRANSCRIPT",
"file": "https://cdn.truv.com/files_examples/VOLUNTEER_LETTER.pdf",
"md5sum": "24d7e80942ce4ad58a93f70ce4115f5c",
"parsed_data": {
"total_hours": 89.6,
"time_entries": [
{
"date": "2025-01-29",
"hours": 5.1,
"description": "Facilitated group activities and sessions"
},
{
"date": "2025-02-02",
"hours": 5,
"description": "Assisted with data entry and record keeping"
},
{
"date": "2025-02-05",
"hours": 5.8,
"description": "Participated in community cleanup and maintenance"
},
{
"date": "2025-02-07",
"hours": 3.4,
"description": "Assisted with food distribution to local families"
},
{
"date": "2025-02-16",
"hours": 5.6,
"description": "Led educational workshops for participants"
}
]
}
}{
"error": {
"code": "authentication_failed",
"message": "No such token"
}
}{
"error": {
"code": "not_authenticated",
"message": "Authentication credentials were not provided."
}
}{
"detail": "Not Found."
}Retrieve parsed document
The endpoint returns a parsed document with its extracted data. The parsed_data field contains structured information extracted from the document.
Note: Volunteer letters and military PCS orders are available through this endpoint.
For volunteer letters, the parsed_data includes volunteer information such as total hours, dates (start_date, end_date), position title, and optionally detailed hour entries with dates, hours, and descriptions for each volunteer activity.
For PCS orders, the parsed_data includes the service branch, pay grade, current and future duty stations, the report no later than (RNLT) date, tour length, dependent information, and the active duty service commitment.
curl --request GET \
--url https://prod.truv.com/v1/links/{link_id}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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}/parsed-documents/{doc_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{
"document_type": "VOLUNTEER_LETTER",
"id": "24d7e80942ce4ad58a93f70ce4115f5c",
"document_subtype": "VOL_TRANSCRIPT",
"file": "https://cdn.truv.com/files_examples/VOLUNTEER_LETTER.pdf",
"md5sum": "24d7e80942ce4ad58a93f70ce4115f5c",
"parsed_data": {
"total_hours": 89.6,
"time_entries": [
{
"date": "2025-01-29",
"hours": 5.1,
"description": "Facilitated group activities and sessions"
},
{
"date": "2025-02-02",
"hours": 5,
"description": "Assisted with data entry and record keeping"
},
{
"date": "2025-02-05",
"hours": 5.8,
"description": "Participated in community cleanup and maintenance"
},
{
"date": "2025-02-07",
"hours": 3.4,
"description": "Assisted with food distribution to local families"
},
{
"date": "2025-02-16",
"hours": 5.6,
"description": "Led educational workshops for participants"
}
]
}
}{
"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
Document type.
VOLUNTEER_LETTER, PCS_ORDERS "VOLUNTEER_LETTER"
Parsed document ID
32"24d7e80942ce4ad58a93f70ce4115f5c"
Document subtype. Set for volunteer letters only; null for PCS orders.
VOL_TRANSCRIPT, VOL_HOURS_LOG, null "VOL_TRANSCRIPT"
Parsed document file link
"https://cdn.truv.com/files_examples/VOLUNTEER_LETTER.pdf"
Parsed document md5sum
36"24d7e80942ce4ad58a93f70ce4115f5c"
Parsed document data. The set of fields depends on the document type.
For volunteer letters, this includes:
total_hours: Total volunteer hours (number)time_entries: (Optional) Detailed breakdown of volunteer hours. Array of objects, each containing:date: Date of volunteer activity (YYYY-MM-DD)hours: Hours worked on that date (number)description: Description of the volunteer activity (string)
The structure depends on the document subtype:
- VOL_TRANSCRIPT: Contains summary fields (total_hours)
- VOL_HOURS_LOG: Contains both summary (total_hours) and detailed time_entries array
For PCS orders, this includes:
-
branch: Issuing service branch — Army, Navy, USMC, Air Force, Coast Guard or Space Force (string) -
rank: Service member's rank normalized to a pay grade, e.g.E-5orO-3(string) -
current_duty_station: Location the member is departing from (string) -
future_duty_station: Location the member is reporting to (string) -
report_no_later_than_date: Report no later than (RNLT) date,YYYY-MM-DD(string) -
tour_length: Tour length when the order states one, e.g.36 months(string) -
dependents: Dependent information when the order states any. Object containing:count: Number of dependents (number)names: Dependent names when the order lists them (array of strings)accompanied: Whether dependent travel is authorized (boolean)
-
active_duty_service_commitment: Service commitment tied to the move, a duration or a date (string)
Every PCS orders field is null when the order does not state it. Nothing is inferred.
{
"total_hours": 89.6,
"time_entries": [
{
"date": "2025-01-29",
"hours": 5.1,
"description": "Facilitated group activities and sessions"
},
{
"date": "2025-02-02",
"hours": 5,
"description": "Assisted with data entry and record keeping"
},
{
"date": "2025-02-05",
"hours": 5.8,
"description": "Participated in community cleanup and maintenance"
},
{
"date": "2025-02-07",
"hours": 3.4,
"description": "Assisted with food distribution to local families"
},
{
"date": "2025-02-16",
"hours": 5.6,
"description": "Led educational workshops for participants"
}
]
}
Was this page helpful?