curl --request POST \
--url https://api.trycactus.com/v1/underwritings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"property": {
"address": {
"line1": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"line2": "<string>"
}
},
"notification_email": "jsmith@example.com",
"end_user_ref": "<string>",
"document_ids": [
"<string>"
],
"options": {
"investment_strategy": "<string>"
}
}
'import requests
url = "https://api.trycactus.com/v1/underwritings"
payload = {
"property": { "address": {
"line1": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"line2": "<string>"
} },
"notification_email": "jsmith@example.com",
"end_user_ref": "<string>",
"document_ids": ["<string>"],
"options": { "investment_strategy": "<string>" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
property: {
address: {
line1: '<string>',
city: '<string>',
state: '<string>',
postal_code: '<string>',
line2: '<string>'
}
},
notification_email: 'jsmith@example.com',
end_user_ref: '<string>',
document_ids: ['<string>'],
options: {investment_strategy: '<string>'}
})
};
fetch('https://api.trycactus.com/v1/underwritings', 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/underwritings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'property' => [
'address' => [
'line1' => '<string>',
'city' => '<string>',
'state' => '<string>',
'postal_code' => '<string>',
'line2' => '<string>'
]
],
'notification_email' => 'jsmith@example.com',
'end_user_ref' => '<string>',
'document_ids' => [
'<string>'
],
'options' => [
'investment_strategy' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.trycactus.com/v1/underwritings"
payload := strings.NewReader("{\n \"property\": {\n \"address\": {\n \"line1\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"line2\": \"<string>\"\n }\n },\n \"notification_email\": \"jsmith@example.com\",\n \"end_user_ref\": \"<string>\",\n \"document_ids\": [\n \"<string>\"\n ],\n \"options\": {\n \"investment_strategy\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.trycactus.com/v1/underwritings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"property\": {\n \"address\": {\n \"line1\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"line2\": \"<string>\"\n }\n },\n \"notification_email\": \"jsmith@example.com\",\n \"end_user_ref\": \"<string>\",\n \"document_ids\": [\n \"<string>\"\n ],\n \"options\": {\n \"investment_strategy\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycactus.com/v1/underwritings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"property\": {\n \"address\": {\n \"line1\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"line2\": \"<string>\"\n }\n },\n \"notification_email\": \"jsmith@example.com\",\n \"end_user_ref\": \"<string>\",\n \"document_ids\": [\n \"<string>\"\n ],\n \"options\": {\n \"investment_strategy\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "uw_01J9ZK3M",
"object": "underwriting",
"status": "queued",
"sandbox": true,
"created_at": "2023-11-07T05:31:56Z",
"progress": {
"phase": "<string>",
"detail": "<string>"
},
"property": {},
"end_user_ref": "<string>",
"document_ids": [
"<string>"
],
"billed_total_usd": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"elapsed_seconds": 640,
"poll_after_seconds": 30,
"report": {
"url": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
},
"summary": {},
"error": {
"code": "<string>",
"message": "<string>"
}
}Start an automated underwriting run
Kicks off the full automated underwriting workflow for a property.
Documents are optional; when provided they are validated and
accepted, then ingested before the run starts.
On completion, the notification email receives a signed link to the
hosted financial-analysis report, and underwriting.completed is
delivered to registered webhook endpoints.
curl --request POST \
--url https://api.trycactus.com/v1/underwritings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"property": {
"address": {
"line1": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"line2": "<string>"
}
},
"notification_email": "jsmith@example.com",
"end_user_ref": "<string>",
"document_ids": [
"<string>"
],
"options": {
"investment_strategy": "<string>"
}
}
'import requests
url = "https://api.trycactus.com/v1/underwritings"
payload = {
"property": { "address": {
"line1": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"line2": "<string>"
} },
"notification_email": "jsmith@example.com",
"end_user_ref": "<string>",
"document_ids": ["<string>"],
"options": { "investment_strategy": "<string>" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
property: {
address: {
line1: '<string>',
city: '<string>',
state: '<string>',
postal_code: '<string>',
line2: '<string>'
}
},
notification_email: 'jsmith@example.com',
end_user_ref: '<string>',
document_ids: ['<string>'],
options: {investment_strategy: '<string>'}
})
};
fetch('https://api.trycactus.com/v1/underwritings', 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/underwritings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'property' => [
'address' => [
'line1' => '<string>',
'city' => '<string>',
'state' => '<string>',
'postal_code' => '<string>',
'line2' => '<string>'
]
],
'notification_email' => 'jsmith@example.com',
'end_user_ref' => '<string>',
'document_ids' => [
'<string>'
],
'options' => [
'investment_strategy' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.trycactus.com/v1/underwritings"
payload := strings.NewReader("{\n \"property\": {\n \"address\": {\n \"line1\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"line2\": \"<string>\"\n }\n },\n \"notification_email\": \"jsmith@example.com\",\n \"end_user_ref\": \"<string>\",\n \"document_ids\": [\n \"<string>\"\n ],\n \"options\": {\n \"investment_strategy\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.trycactus.com/v1/underwritings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"property\": {\n \"address\": {\n \"line1\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"line2\": \"<string>\"\n }\n },\n \"notification_email\": \"jsmith@example.com\",\n \"end_user_ref\": \"<string>\",\n \"document_ids\": [\n \"<string>\"\n ],\n \"options\": {\n \"investment_strategy\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycactus.com/v1/underwritings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"property\": {\n \"address\": {\n \"line1\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"line2\": \"<string>\"\n }\n },\n \"notification_email\": \"jsmith@example.com\",\n \"end_user_ref\": \"<string>\",\n \"document_ids\": [\n \"<string>\"\n ],\n \"options\": {\n \"investment_strategy\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "uw_01J9ZK3M",
"object": "underwriting",
"status": "queued",
"sandbox": true,
"created_at": "2023-11-07T05:31:56Z",
"progress": {
"phase": "<string>",
"detail": "<string>"
},
"property": {},
"end_user_ref": "<string>",
"document_ids": [
"<string>"
],
"billed_total_usd": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"elapsed_seconds": 640,
"poll_after_seconds": 30,
"report": {
"url": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
},
"summary": {},
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Partner API key issued by Cactus.
Headers
Unique key making the request safely retryable.
255Body
Show child attributes
Show child attributes
Receives the signed report link on completion.
Your own identifier for the user this underwriting is for. Each
distinct value is isolated: one end user never sees another's
analyses, and GET /v1/underwritings?end_user_ref= returns only
theirs. Use a stable opaque id rather than an email.
Omit it only when underwriting on your own behalf. If your
account is configured to require it, omitting it returns 422
(end_user_ref_required).
1 - 255Optional supporting documents. Validated on acceptance; oversized files are rejected.
Show child attributes
Show child attributes
Response
Run queued.
"uw_01J9ZK3M"
"underwriting"queued, ingesting, underwriting, calculating, completed, failed Show child attributes
Show child attributes
Echo of the submitted property.
Echo of the submitted end-user identifier, when one was supplied.
Whole seconds since created_at. Present while the run is active, so a caller can tell a run that just started from one approaching the 4-hour ceiling without doing date math.
640
Recommended seconds to wait before polling again. Present while the run is active; mirrors the Retry-After header. Prefer this over a hard-coded interval.
30
Present when completed.
Show child attributes
Show child attributes
DRAFT — machine-readable headline results (key underwriting metrics).
Show child attributes
Show child attributes