property-turnover

Scope a property turnover

Turn move-out / turnover inspection findings for a US rental unit into a priced make-ready scope: standardized tasks by trade, regional low/expected/high costs, must/should/could priorities, vendor scopes, refer-outs to licensed professionals, and every assumption stated. When to use: Turnover findings for a US rental unit when you need control: rooms, measured quantities, the manager's own prices (rate_card) or owner approve/decline decisions. For a plain-English estimate, property_turnover_quick_estimate is easier. Not for: Diagnosing hazards (they come back as refer-outs to a licensed professional); legal advice on deposits; remodel bids; properties outside the US. Tip: If the ZIP is missing or not exactly 5 digits, ask the user; never guess or pad it. Tip: From photos, describe only what is visible, with its room (location); an issue code only if one clearly fits. Hedge doubtful ones ("possible", "?") and ask the user about what photos cannot show: working appliances, odors, pests, sizes. Never state that a tenant caused damage because of a photo; responsibility stays a hint from the engine. Send no faces, names or addresses. A photo of a written checklist or report is different, so transcribe it as written. Tip: Describe each finding in plain words (description). Only send a code returned by property_turnover_issue_codes. Words the matcher cannot place come back as a manual-quote line with suggested codes. With read set to ai, an AI model reads them first: the answer is a draft and reading.findings lists what it read. Tip: To confirm an AI reading, send the findings from reading.findings (keep each one's extraction, correct any the user changes) with confirmed true on each one the user checked. The answer is then verified and still shows which findings were read by AI. Tip: Give measured quantities when you have them (e.g. 120 sq_ft); otherwise typical sizes are assumed and listed in assumptions. Tip: Send property.floor_coverings when you know whether there is carpet, and unit_type single_family for houses; both change the baseline scope. Tip: Relay the summary, refer_outs, assumptions and unknowns to the user; costs are estimate ranges, not quotes. Tip: Use detail=summary unless the user asks for every line item (summary already lists every line tied to a finding). Tip: Rate card examples - {"trade": "handyman", "unit_price": 65, "uom": "hour"} or {"task_id": "carpet.clean", "unit_price": 0.2, "uom": "sq_ft"}; check rate_card_applied and rate_card_ignored before saying a rate was used. Tip: For the Excel workbook or owner estimate, give the user links.web_tool_prefilled (opens the free web tool with these findings) or POST the same arguments to links.downloads; do not build a spreadsheet yourself. The same findings under the same ruleset return the same result_hash. An AI model may read notes into findings, marked for review (review, reading); it never sets a number. Capability property-turnover v0.14.0 (experimental).

post/v1/property-turnover/scope

Request

  • Base URL: https://tektolo.com (the document declares no server; this is the origin it was published from)
  • URL: https://tektolo.com/v1/property-turnover/scope
  • Auth: none declared

Headers

Tektolo-Rulesetstring nullable

Optional. The ruleset version you built against, as results carry it in provenance.ruleset_version (e.g. 'sd-2026.11.14'), or its sha256: hash. If the rules have changed since, the call fails (nothing computed, nothing charged) and says what is in force now, so you upgrade on your own schedule. Leave it out to answer under the current rules.

Tektolo-Ruleset-Modestring nullable

Optional, with Tektolo-Ruleset. 'serve' asks us to answer under the ruleset version you named even when the rules have changed since, from that version's signed bundle. The answer says so (run.served_from_bundle and the Tektolo-Ruleset-Served header). We refuse (412, with a reason) a version older than 12 months, one a later correction or law change replaced for your state, or one we have no bundle for. Leave it out to be refused whenever the rules have changed.

Request body

client_refsobject nullable

Your own reference ids (e.g. unit_id, job_id). Echoed back, never used.

trade_vendorsobject

Vendor (name, contact) to put on each trade's lines.

read'parser' | 'ai'

parser (default): descriptions are read by the deterministic parser and matcher only; what they cannot place comes back as a manual-quote line with suggested codes. ai: what the parser cannot place is then read by an AI model; the answer is a draft (review.status) and echoes the reading, whose findings you confirm and send back for a verified answer (contract 0.12.0).

retainboolean

Optional (contract 0.5.0). false: keep none of this request's text. By default the finding descriptions are kept with contact details and access codes removed, to improve matching; the estimate is the same either way.

detail'summary' | 'full'

summary: totals, trade scopes, every line tied to a finding (capped at 40) plus the largest must-fix/refer-out lines, a one-line note on the routine lines left out, notes, and only findings needing attention (small). full: every line, finding and source.

Response

Successful Response

client_refsobject
input_hashstring required

Hash of the question the rules answered: the request, or when free text was read by AI, the request with the read findings (reading.findings) in its place.

request_hashstring nullable

Hash of the request as sent; equal to input_hash when nothing was read by AI.

result_hashstring required

Changes

No recorded changes to this operation across all 1 revision of this API.