Retrieve the structured output of a completed extraction
curl --request GET \
--url https://api.trycactus.com/v1/extractions/{extraction_id}/result \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.trycactus.com/v1/extractions/{extraction_id}/result"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.trycactus.com/v1/extractions/{extraction_id}/result', 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.trycactus.com/v1/extractions/{extraction_id}/result",
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.trycactus.com/v1/extractions/{extraction_id}/result"
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.trycactus.com/v1/extractions/{extraction_id}/result")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycactus.com/v1/extractions/{extraction_id}/result")
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{
"extraction_id": "ext_01J9ZJYA",
"results": [
{
"document_id": "doc_01J9ZJXV",
"document_type": "rent_roll",
"schema_version": "rent_roll.v1",
"data": {
"as_of_date": null,
"headers": [
{
"key": "unit",
"label": "Unit",
"type": "text"
},
{
"key": "building",
"label": "Building",
"type": "text"
},
{
"key": "floor",
"label": "Floor",
"type": "text"
},
{
"key": "address",
"label": "Address",
"type": "text"
},
{
"key": "tenant",
"label": "Tenant",
"type": "text"
},
{
"key": "status",
"label": "Status",
"type": "text"
},
{
"key": "status_normalized",
"label": "Status (normalized)",
"type": "text"
},
{
"key": "area",
"label": "Area",
"type": "area"
},
{
"key": "unit_type",
"label": "Unit type",
"type": "text"
},
{
"key": "lease_start",
"label": "Lease start",
"type": "date"
},
{
"key": "lease_end",
"label": "Lease end",
"type": "date"
},
{
"key": "lease_term",
"label": "Lease term (months)",
"type": "number"
},
{
"key": "move_in",
"label": "Move in",
"type": "date"
},
{
"key": "move_out",
"label": "Move out",
"type": "date"
},
{
"key": "rent",
"label": "Rent",
"type": "currency"
},
{
"key": "rent_period",
"label": "Rent period",
"type": "text"
},
{
"key": "market_rent",
"label": "Market rent",
"type": "currency"
},
{
"key": "concession",
"label": "Concession",
"type": "currency"
},
{
"key": "deposit",
"label": "Deposit",
"type": "currency"
},
{
"key": "other_income",
"label": "Other income",
"type": "currency"
},
{
"key": "total_charges",
"label": "Total charges",
"type": "currency"
},
{
"key": "escalation",
"label": "Escalation",
"type": "text"
},
{
"key": "balance",
"label": "Balance",
"type": "currency"
},
{
"key": "prepaid",
"label": "Prepaid",
"type": "currency"
},
{
"key": "bedrooms",
"label": "Bedrooms",
"type": "number"
},
{
"key": "bathrooms",
"label": "Bathrooms",
"type": "number"
},
{
"key": "bed_bath",
"label": "Bed/bath",
"type": "text"
},
{
"key": "furnished",
"label": "Furnished",
"type": "text"
},
{
"key": "subsidized",
"label": "Subsidized",
"type": "text"
},
{
"key": "subsidy_amount",
"label": "Subsidy amount",
"type": "currency"
},
{
"key": "custom__surety_bonds",
"label": "Surety Bonds",
"type": "currency"
},
{
"key": "custom__notes",
"label": "Notes",
"type": "text"
}
],
"units": [
{
"unit": "A01",
"status": "C",
"status_normalized": "Occupied",
"area": 1000,
"unit_type": "B1",
"lease_start": "2025-05-07",
"lease_end": "2026-05-06",
"move_in": "2025-05-07",
"rent": 1334,
"market_rent": 1334,
"deposit": 250,
"total_charges": 1579,
"balance": -3463,
"custom__surety_bonds": 0
},
{
"unit": "A02",
"status": "C",
"status_normalized": "Occupied",
"area": 1000,
"unit_type": "B1",
"lease_start": "2025-10-01",
"lease_end": "2026-12-31",
"move_in": "2022-07-08",
"rent": 1250,
"market_rent": 1389,
"deposit": 250,
"total_charges": 1440,
"balance": -1440,
"custom__surety_bonds": 0
},
{
"unit": "A03",
"status": "C",
"status_normalized": "Occupied",
"area": 1000,
"unit_type": "B1-P",
"lease_start": "2025-11-01",
"lease_end": "2027-01-31",
"move_in": "2022-08-12",
"rent": 1493,
"market_rent": 1515,
"deposit": 250,
"total_charges": 1662,
"balance": 0,
"custom__surety_bonds": 0
}
],
"unit_count": 168,
"printed_totals": {
"unit_count": {
"value": 168,
"source": {
"page": 1,
"cell": "P1669"
}
},
"occupied_count": {
"value": 157,
"source": {
"page": 1,
"cell": "P1667"
}
},
"vacant_count": {
"value": 11,
"source": {
"page": 1,
"cell": "P1668"
}
},
"total_market_rent": {
"value": 234865,
"source": {
"page": 1,
"cell": "G1669"
}
},
"total_lease_rent": {
"value": 160140,
"source": {
"page": 1,
"cell": "V1686"
}
},
"total_square_footage": {
"value": 160140,
"source": {
"page": 1,
"cell": "V1669"
}
},
"total_deposit": {
"value": 31806,
"source": {
"page": 1,
"cell": "AN1635"
}
},
"total_balance": {
"value": -83676.71,
"source": {
"page": 1,
"cell": "AO1635"
}
}
}
},
"validation": {
"checks": [
{
"code": "rent_roll_consolidation",
"status": "passed"
},
{
"code": "rent_roll_printed_totals",
"status": "warning",
"compared": [
{
"key": "unit_count",
"printed": 168,
"computed": 168,
"agrees": true
},
{
"key": "total_market_rent",
"printed": 234865,
"computed": 234865,
"agrees": true
},
{
"key": "total_lease_rent",
"printed": 160140,
"computed": 204660,
"agrees": false
},
{
"key": "total_square_footage",
"printed": 160140,
"computed": 160140,
"agrees": true
},
{
"key": "total_deposit",
"printed": 31806,
"computed": 31806,
"agrees": true
},
{
"key": "total_balance",
"printed": -83676.71,
"computed": -83676.71,
"agrees": true
},
{
"key": "occupied_count + vacant_count",
"printed": 168,
"computed": 168,
"agrees": true
}
],
"message": "1 of 7 printed totals disagree with the extracted unit rows: total_lease_rent printed 160140 vs 204660.0 extracted. The printed figures are reported as stated; the difference is in what we read."
}
],
"confidence_status": "completed"
}
}
]
}
Extractions
Retrieve the structured output of a completed extraction
Returns one result per document in the extraction. The shape of each
data object depends on the document’s type — switch on
schema_version and pick the matching example in the response panel,
one per shape.
To see a full payload before writing any integration code, run the same
request against a ck_sandbox_ key: the documented
example documents return real extracted output instantly,
with no upload and no billing.
The examples are abridged so the payloads stay readable. Each is the sandbox fixture for its shape, with long arrays trimmed:
rent_roll(example-rent-roll-2.xlsx) —unitsshows the first 3 of 168 rows (unit_countandheadersare complete).t12(example-t12-2.xlsx) — 4unknowncolumn(s) are omitted fromheadersand from every line item’scells— the live response includes them;line_itemsshows the first 7 of 200 line items, each with all of its remaining cells (metadatais complete).offering_memorandum(generic fixture) — 1 section shows only the first 4 facts (propertyis complete).other(generic fixture) — shown in full.
GET
/
v1
/
extractions
/
{extraction_id}
/
result
Retrieve the structured output of a completed extraction
curl --request GET \
--url https://api.trycactus.com/v1/extractions/{extraction_id}/result \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.trycactus.com/v1/extractions/{extraction_id}/result"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.trycactus.com/v1/extractions/{extraction_id}/result', 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.trycactus.com/v1/extractions/{extraction_id}/result",
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.trycactus.com/v1/extractions/{extraction_id}/result"
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.trycactus.com/v1/extractions/{extraction_id}/result")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycactus.com/v1/extractions/{extraction_id}/result")
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{
"extraction_id": "ext_01J9ZJYA",
"results": [
{
"document_id": "doc_01J9ZJXV",
"document_type": "rent_roll",
"schema_version": "rent_roll.v1",
"data": {
"as_of_date": null,
"headers": [
{
"key": "unit",
"label": "Unit",
"type": "text"
},
{
"key": "building",
"label": "Building",
"type": "text"
},
{
"key": "floor",
"label": "Floor",
"type": "text"
},
{
"key": "address",
"label": "Address",
"type": "text"
},
{
"key": "tenant",
"label": "Tenant",
"type": "text"
},
{
"key": "status",
"label": "Status",
"type": "text"
},
{
"key": "status_normalized",
"label": "Status (normalized)",
"type": "text"
},
{
"key": "area",
"label": "Area",
"type": "area"
},
{
"key": "unit_type",
"label": "Unit type",
"type": "text"
},
{
"key": "lease_start",
"label": "Lease start",
"type": "date"
},
{
"key": "lease_end",
"label": "Lease end",
"type": "date"
},
{
"key": "lease_term",
"label": "Lease term (months)",
"type": "number"
},
{
"key": "move_in",
"label": "Move in",
"type": "date"
},
{
"key": "move_out",
"label": "Move out",
"type": "date"
},
{
"key": "rent",
"label": "Rent",
"type": "currency"
},
{
"key": "rent_period",
"label": "Rent period",
"type": "text"
},
{
"key": "market_rent",
"label": "Market rent",
"type": "currency"
},
{
"key": "concession",
"label": "Concession",
"type": "currency"
},
{
"key": "deposit",
"label": "Deposit",
"type": "currency"
},
{
"key": "other_income",
"label": "Other income",
"type": "currency"
},
{
"key": "total_charges",
"label": "Total charges",
"type": "currency"
},
{
"key": "escalation",
"label": "Escalation",
"type": "text"
},
{
"key": "balance",
"label": "Balance",
"type": "currency"
},
{
"key": "prepaid",
"label": "Prepaid",
"type": "currency"
},
{
"key": "bedrooms",
"label": "Bedrooms",
"type": "number"
},
{
"key": "bathrooms",
"label": "Bathrooms",
"type": "number"
},
{
"key": "bed_bath",
"label": "Bed/bath",
"type": "text"
},
{
"key": "furnished",
"label": "Furnished",
"type": "text"
},
{
"key": "subsidized",
"label": "Subsidized",
"type": "text"
},
{
"key": "subsidy_amount",
"label": "Subsidy amount",
"type": "currency"
},
{
"key": "custom__surety_bonds",
"label": "Surety Bonds",
"type": "currency"
},
{
"key": "custom__notes",
"label": "Notes",
"type": "text"
}
],
"units": [
{
"unit": "A01",
"status": "C",
"status_normalized": "Occupied",
"area": 1000,
"unit_type": "B1",
"lease_start": "2025-05-07",
"lease_end": "2026-05-06",
"move_in": "2025-05-07",
"rent": 1334,
"market_rent": 1334,
"deposit": 250,
"total_charges": 1579,
"balance": -3463,
"custom__surety_bonds": 0
},
{
"unit": "A02",
"status": "C",
"status_normalized": "Occupied",
"area": 1000,
"unit_type": "B1",
"lease_start": "2025-10-01",
"lease_end": "2026-12-31",
"move_in": "2022-07-08",
"rent": 1250,
"market_rent": 1389,
"deposit": 250,
"total_charges": 1440,
"balance": -1440,
"custom__surety_bonds": 0
},
{
"unit": "A03",
"status": "C",
"status_normalized": "Occupied",
"area": 1000,
"unit_type": "B1-P",
"lease_start": "2025-11-01",
"lease_end": "2027-01-31",
"move_in": "2022-08-12",
"rent": 1493,
"market_rent": 1515,
"deposit": 250,
"total_charges": 1662,
"balance": 0,
"custom__surety_bonds": 0
}
],
"unit_count": 168,
"printed_totals": {
"unit_count": {
"value": 168,
"source": {
"page": 1,
"cell": "P1669"
}
},
"occupied_count": {
"value": 157,
"source": {
"page": 1,
"cell": "P1667"
}
},
"vacant_count": {
"value": 11,
"source": {
"page": 1,
"cell": "P1668"
}
},
"total_market_rent": {
"value": 234865,
"source": {
"page": 1,
"cell": "G1669"
}
},
"total_lease_rent": {
"value": 160140,
"source": {
"page": 1,
"cell": "V1686"
}
},
"total_square_footage": {
"value": 160140,
"source": {
"page": 1,
"cell": "V1669"
}
},
"total_deposit": {
"value": 31806,
"source": {
"page": 1,
"cell": "AN1635"
}
},
"total_balance": {
"value": -83676.71,
"source": {
"page": 1,
"cell": "AO1635"
}
}
}
},
"validation": {
"checks": [
{
"code": "rent_roll_consolidation",
"status": "passed"
},
{
"code": "rent_roll_printed_totals",
"status": "warning",
"compared": [
{
"key": "unit_count",
"printed": 168,
"computed": 168,
"agrees": true
},
{
"key": "total_market_rent",
"printed": 234865,
"computed": 234865,
"agrees": true
},
{
"key": "total_lease_rent",
"printed": 160140,
"computed": 204660,
"agrees": false
},
{
"key": "total_square_footage",
"printed": 160140,
"computed": 160140,
"agrees": true
},
{
"key": "total_deposit",
"printed": 31806,
"computed": 31806,
"agrees": true
},
{
"key": "total_balance",
"printed": -83676.71,
"computed": -83676.71,
"agrees": true
},
{
"key": "occupied_count + vacant_count",
"printed": 168,
"computed": 168,
"agrees": true
}
],
"message": "1 of 7 printed totals disagree with the extracted unit rows: total_lease_rent printed 160140 vs 204660.0 extracted. The printed figures are reported as stated; the difference is in what we read."
}
],
"confidence_status": "completed"
}
}
]
}