Build on Doorline
Everything you need to embed residential rental underwriting into your own product. The Doorline API returns real values — rent estimates, cap rate, investment score — from a simple HTTP request.
https://doorline.triforce-software.com/api/v1Getting started
Create a free account, then issue an API key from the Developer dashboard. The free tier gives you 10 full analyses per month — enough to prototype a real integration.
curl -X POST https://doorline.triforce-software.com/api/v1/analyze \
-H "Authorization: Bearer ra_live_..." \
-H "Content-Type: application/json" \
-d '{ "address": "123 Main St, Austin, TX 78704" }'Authentication
All requests require a bearer token. Keys start with ra_live_ and are shown only once on creation.
Authorization: Bearer ra_live_xxxxxxxxxxxxxxxxxxxxxxxxPOST /v1/analyze
Run a full rental analysis on a US residential address. Returns property details, computed metrics, and (optionally) an AI memo.
| Parameter | Type | Description |
|---|---|---|
addressrequired | string | Full US address. E.g. '123 Main St, Austin, TX 78704'. |
assumptions | object | Override default investor assumptions (down payment %, rate, term, vacancy, etc.). |
runAi | boolean | If true (default), include AI score + memo. Set false for a 3-5s faster response. |
useCached | boolean | If true, return the most recent saved analysis for this address without re-running the pipeline. Does not consume a credit and bypasses the free-plan quota. Returns 404 `no_cached_analysis` when no prior analysis exists — falls back to nothing, so opt in only when you know the address has been analyzed before. The `assumptions` field is ignored on cached reads (the stored snapshot is returned as-is). |
Request
curl -X POST https://doorline.triforce-software.com/api/v1/analyze \
-H "Authorization: Bearer ra_live_..." \
-H "Content-Type: application/json" \
-d '{
"address": "123 Main St, Austin, TX 78704",
"assumptions": {
"downPaymentPercent": 0.25,
"interestRate": 0.07
},
"runAi": true
}'Response
{
"data": {
"cached": false,
"analysis_id": "uuid",
"property": {
"address": "123 Main St, Austin, TX 78704",
"bedrooms": 3,
"bathrooms": 2,
"square_feet": 1850,
"year_built": 2012,
"estimated_value": 685000,
"monthly_rent_estimate": 3450
},
"metrics": {
"monthly_cash_flow": 412,
"annual_cash_flow": 4944,
"cap_rate": 0.064,
"cash_on_cash_return": 0.089,
"dscr": 1.32,
"total_roi": 0.152,
"one_percent_rule": true
},
"ai": {
"score": 78,
"recommendation": "buy",
"summary": "...",
"risk_factors": [...],
"opportunities": [...]
}
},
"request_id": "..."
}GET /v1/property
Fetch aggregated property data without running the full investment analysis. Cheaper — 0.1 credit per call.
curl "https://doorline.triforce-software.com/api/v1/property?address=123+Main+St+Austin+TX" \
-H "Authorization: Bearer ra_live_..."GET /v1/rent-estimate
The cheapest endpoint (0.25 credits). Returns only the monthly rent estimate and comp count — perfect for bulk screening.
curl "https://doorline.triforce-software.com/api/v1/rent-estimate?address=123+Main+St+Austin+TX" \
-H "Authorization: Bearer ra_live_..."Rate limits & quotas
Each plan has a rate limit (requests/second) and an included-call quota. Overage beyond the quota is billed at period end via Stripe metered billing.
Credit cost per endpoint
/v1/analyze/v1/property/v1/rent-estimate/v1/finder/search/v1/market/v1/chatErrors
All errors return a structured JSON body with a machine-readable code and human-readablemessage.
{
"error": {
"message": "Free plan limit reached — upgrade at /developer/billing",
"code": "quota_exceeded"
},
"request_id": "..."
}| Code | HTTP | Meaning |
|---|---|---|
unauthorized | 401 | Missing or malformed Authorization header. |
invalid_key | 401 | Key doesn't exist or has been revoked. |
no_subscription | 402 | User has no active API subscription. |
quota_exceeded | 429 | Free plan only. Paid plans bill overage instead. |
invalid_request | 400 | Request body failed schema validation — see `details`. |
no_cached_analysis | 404 | `useCached: true` was sent but no prior analysis exists for that address. |
internal_error | 500 | Transient server issue. Safe to retry with backoff. |
Webhooks
Growth and higher can configure webhooks under Developer → Webhooks to receive events like analysis.completed, finder.match, and usage.threshold_reached.