Skip to main content
POST
Extract normalized underwriting model inputs from documents

Authorizations

Authorization
string
header
required

Partner API key issued by Cactus.

Headers

Idempotency-Key
string

Unique key making the request safely retryable.

Maximum string length: 255

Body

application/json
document_ids
string[]
required

Documents to read together. They are reconciled as one property, so send the whole package (OM, rent roll, T-12) rather than one job per file — a field stated in one document is available to every section.

Required array length: 1 - 10 elements
asset_class
enum<string>
required

Selects the underwriting model. Only asset classes with a model behind them are accepted; the rest return 422 (unsupported_asset_class).

Available options:
multifamily,
self-storage,
industrial-outdoor-storage,
commercial,
industrial,
office,
retail,
hotel
investment_strategy
string

Strategy within the asset class. Defaults to that class's value-add strategy.

Example:

"mf-value-add"

sourced_only
boolean
default:false

Return only fields the documents supported (basis of document or derived), omitting model defaults. validation.coverage still counts the full run, so you can see how much was withheld.

end_user_ref
string

Your own identifier for the end user this job is for. Isolates the job's working data from other end users'.

Required string length: 1 - 255

Response

Job accepted.

id
string
required
Example:

"uwi_01J9ZK4P"

object
string
required
Allowed value: "underwriting_inputs"
status
enum<string>
required
Available options:
processing,
completed,
failed
sandbox
boolean
required
created_at
string<date-time>
required
progress
object

Present while the job is active.

document_ids
string[]
asset_class
enum<string>
Available options:
multifamily,
self-storage,
industrial-outdoor-storage,
commercial,
industrial,
office,
retail,
hotel
investment_strategy
string
schema_version
string
Allowed value: "underwriting_inputs.v1"
billed
object
billed_total_usd
string
completed_at
string<date-time>
elapsed_seconds
integer

Whole seconds since created_at. Present while the job is active.

poll_after_seconds
integer

Recommended seconds to wait before polling again. Mirrors the Retry-After header.

result_url
string

Present when completed.

error
object