Volume I · API reference

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.

Base URLhttps://doorline.triforce-software.com/api/v1
01

Getting 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.

bash
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" }'
02

Authentication

All requests require a bearer token. Keys start with ra_live_ and are shown only once on creation.

Authorization: Bearer ra_live_xxxxxxxxxxxxxxxxxxxxxxxx
Keep keys server-side. Never embed them in client bundles or commit them to git. Rotate via the dashboard if exposed.
03

POST /v1/analyze

Run a full rental analysis on a US residential address. Returns property details, computed metrics, and (optionally) an AI memo.

ParameterTypeDescription
addressrequiredstringFull US address. E.g. '123 Main St, Austin, TX 78704'.
assumptionsobjectOverride default investor assumptions (down payment %, rate, term, vacancy, etc.).
runAibooleanIf true (default), include AI score + memo. Set false for a 3-5s faster response.
useCachedbooleanIf 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

bash
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": "..."
}
04

GET /v1/property

Fetch aggregated property data without running the full investment analysis. Cheaper — 0.1 credit per call.

bash
curl "https://doorline.triforce-software.com/api/v1/property?address=123+Main+St+Austin+TX" \
  -H "Authorization: Bearer ra_live_..."
05

GET /v1/rent-estimate

The cheapest endpoint (0.25 credits). Returns only the monthly rent estimate and comp count — perfect for bulk screening.

bash
curl "https://doorline.triforce-software.com/api/v1/rent-estimate?address=123+Main+St+Austin+TX" \
  -H "Authorization: Bearer ra_live_..."
06

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

POST/v1/analyze
1 credit
GET/v1/property
0.1 credits
GET/v1/rent-estimate
0.25 credits
POST/v1/finder/search
0.5 credits
GET/v1/market
0.1 credits
POST/v1/chat
1 credit
07

Errors

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": "..."
}
CodeHTTPMeaning
unauthorized401Missing or malformed Authorization header.
invalid_key401Key doesn't exist or has been revoked.
no_subscription402User has no active API subscription.
quota_exceeded429Free plan only. Paid plans bill overage instead.
invalid_request400Request body failed schema validation — see `details`.
no_cached_analysis404`useCached: true` was sent but no prior analysis exists for that address.
internal_error500Transient server issue. Safe to retry with backoff.
08

Webhooks

Growth and higher can configure webhooks under Developer → Webhooks to receive events like analysis.completed, finder.match, and usage.threshold_reached.

Coming soon — Webhooks are on the roadmap. Reach out if you need them in the meantime.